2 votos

Comprobar si un punto 3D está dentro de una esfera

Sé que hay una forma bastante sencilla de comprobar si un punto 2D está dentro de un círculo, quería saber cómo hacer lo mismo pero en la 3ª dimensión. Las variables son las X, Y, Z del punto y el radio de la esfera en 3D.

Digamos que sabemos que X e Y están dentro del círculo, ¿podemos girarlo 90 grados y fingir que la Z es la X o la Y de nuevo y utilizar el mismo algoritmo?

Comprobaré en 2 bucles for para X e Y si cada punto está dentro del círculo, utilizaré el X y el Y para trazar el píxel y el Z para determinar el color.

EDITAR:

Gracias por la respuesta, no me había dado cuenta de que podía incluir la Z en el algoritmo del que hablaba. Por si te interesa aquí está el código, ¡funciona de maravilla! Está en F#.

open System.IO
open System.Drawing

type Vector = { X: int; Y: int; Z: int }

type Sphere = { Center: Vector; Radius: int }

let intersect v s =
    let x0, y0, z0 = float(v.X), float(v.Y), float(v.Z)
    let x1, y1, z1 = float(s.Center.X), float(s.Center.Y), float(s.Center.Z)
    sqrt(pown(x0 - x1) 2 + pown(y0 - y1) 2 + pown(z0 - z1) 2) < float(s.Radius)

let sphere = { Center = { X = 127; Y = 127; Z = 127 }; Radius = 127 }

let bitmap = new Bitmap(256, 256)

for x in 0 .. 255 do
    for y in 0 .. 255 do
        for z in 0 .. 255 do
            if intersect { X = x; Y = y; Z = z } sphere then
                bitmap.SetPixel(x, y, Color.FromArgb(z, 0, 0, 255))

bitmap.Save(Path.Combine(__SOURCE_DIRECTORY__, "bitmap.png"))

8voto

Technophile Puntos 101

En lugar de utilizar dos pruebas 2D para comprobar (lo cual es incorrecto - los puntos que pasan ambas pruebas sólo están garantizados dentro de un mouhefanggai/Steinmetz sólido que encierra estrictamente la esfera), una simple extensión de la prueba 2D funcionará. Sean las coordenadas del centro de la esfera $(c_x,c_y,c_z)$ y su radio sea $r$ , entonces señala $(x,y,z)$ está en la esfera si $(x-c_x)^2+(y-c_y)^2+(z-c_z)^2<r^2$ .

5voto

hiru Puntos 6

Si un punto $M$ de coordenadas cartesianas $x_0,y_0,z_0$ está dentro de un círculo de centro $x_c,y_c,z_c$ de radio $R$ significa que $\sqrt{(x_0-x_c)^2+(y_0-y_c)^2 + (z_0-z_c)^2} \leq R$ .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X