una ubica trazar traza segmento recta punto por perpendiculares perpendicular paralela lineas linea fuera extremo exterior ella con compas como bisectriz math 3d geometry

math - ubica - Perpendicular en un segmento de línea desde un punto dado



traza una recta ab y ubica un punto c por fuera de la recta (9)

Aquí hay una implementación de Python basada en la respuesta de Corey Ogburn de este hilo .
Proyecta el punto q en el segmento de línea definido por p1 y p2 dando como resultado el punto r .
Devolverá nulo si r cae fuera del segmento de línea:

def is_point_on_line(p1, p2, q): if (p1[0] == p2[0]) and (p1[1] == p2[1]): p1[0] -= 0.00001 U = ((q[0] - p1[0]) * (p2[0] - p1[0])) + ((q[1] - p1[1]) * (p2[1] - p1[1])) Udenom = math.pow(p2[0] - p1[0], 2) + math.pow(p2[1] - p1[1], 2) U /= Udenom r = [0, 0] r[0] = p1[0] + (U * (p2[0] - p1[0])) r[1] = p1[1] + (U * (p2[1] - p1[1])) minx = min(p1[0], p2[0]) maxx = max(p1[0], p2[0]) miny = min(p1[1], p2[1]) maxy = max(p1[1], p2[1]) is_valid = (minx <= r[0] <= maxx) and (miny <= r[1] <= maxy) if is_valid: return r else: return None

Quiero calcular un punto en una línea dada que es perpendicular a partir de un punto dado.

Tengo un segmento de línea AB y tengo un punto C fuera del segmento de línea. Quiero calcular un punto D en AB tal que el CD sea perpendicular a AB.

Tengo que encontrar el punto D.

Es bastante similar a this , pero quiero considerar la coordenada Z también, ya que no se muestra correctamente en el espacio 3D.


Aquí he convertido el código contestado de "cuixiping" al código matlab.

function Pr=getSpPoint(Line,Point) % getSpPoint(): find Perpendicular on a line segment from a given point x1=Line(1,1); y1=Line(1,2); x2=Line(2,1); y2=Line(2,1); x3=Point(1,1); y3=Point(1,2); px = x2-x1; py = y2-y1; dAB = px*px + py*py; u = ((x3 - x1) * px + (y3 - y1) * py) / dAB; x = x1 + u * px; y = y1 + u * py; Pr=[x,y]; end


Hay una solución de formulario cerrado simple para esto (que no requiere bucles ni aproximaciones) utilizando el producto vectorial de puntos.

Imagine sus puntos como vectores donde el punto A está en el origen (0,0) y todos los demás puntos están referenciados desde él (puede transformar fácilmente sus puntos en este marco de referencia restando el punto A de cada punto).

En este marco de referencia, el punto D es simplemente la proyección vectorial del punto C en el vector B que se expresa como:

// Per wikipedia this is more efficient than the standard (A . Bhat) * Bhat Vector projection = Vector.DotProduct(A, B) / Vector.DotProduct(B, B) * B

El vector de resultado se puede transformar de nuevo al sistema de coordenadas original agregándole el punto A.



No vi que se ofreciera esta respuesta, pero Ron Warholic tuvo una gran sugerencia con Vector Projection. ACD es simplemente un triángulo rectángulo.

  1. Crea el vector AC ie (Cx - Ax, Cy - Ay)
  2. Crear el vector AB ie (Bx - Ax, By - Ay)
  3. El producto puntual de AC y AB es igual al coseno del ángulo entre los vectores. es decir, cos (theta) = ACx * ABx + ACy * ABy.
  4. La longitud de un vector es sqrt (x * x + y * y)
  5. Longitud de AD = cos (theta) * longitud (AC)
  6. Normalizar AB ie (ABx / longitud (AB), ABy / longitud (AB))
  7. D = A + NAB * longitud (AD)

Prueba: el punto D está en una línea de CD perpendicular a AB y, por supuesto, D pertenece a AB. Escriba el producto Dot de los dos vectores CD.AB = 0, y exprese que D pertenece a AB como D = A + t (BA).

Terminamos con 3 ecuaciones:

Dx=Ax+t(Bx-Ax) Dy=Ay+t(By-Ay) (Dx-Cx)(Bx-Ax)+(Dy-Cy)(By-Ay)=0

Subtituye las dos primeras ecuaciones en la tercera da:

(Ax+t(Bx-Ax)-Cx)(Bx-Ax)+(Ay+t(By-Ay)-Cy)(By-Ay)=0

Distribuyendo para resolver t da:

(Ax-Cx)(Bx-Ax)+t(Bx-Ax)(Bx-Ax)+(Ay-Cy)(By-Ay)+t(By-Ay)(By-Ay)=0

lo que da:

t= -[(Ax-Cx)(Bx-Ax)+(Ay-Cy)(By-Ay)]/[(Bx-Ax)^2+(By-Ay)^2]

Deshacerse de los signos negativos:

t=[(Cx-Ax)(Bx-Ax)+(Cy-Ay)(By-Ay)]/[(Bx-Ax)^2+(By-Ay)^2]

Una vez que tienes t, puedes calcular las coordenadas para D a partir de las dos primeras ecuaciones.

Dx=Ax+t(Bx-Ax) Dy=Ay+t(By-Ay)


Un punto en la línea AB puede ser parametrizado por:

M (x) = A + x * (BA), para x real.

Desea D = M (x) tal que DC y AB sean ortogonales:

punto (BA, CM (x)) = 0.

Es decir: punto (BA, CAx * (BA)) = 0, o punto (BA, CA) = x * punto (BA, BA), dando:

x = punto (BA, CA) / punto (BA, BA) que se define a menos que A = B.


Ya que no está indicando qué idioma está usando, le daré una respuesta genérica:

Simplemente haga que un bucle pase a través de todos los puntos en su segmento AB, "dibuje un segmento" a C desde ellos, obtenga la distancia de C a D y de A a D, y aplique el teorema de Pitágoras. Si AD ^ 2 + CD ^ 2 = AC ^ 2, entonces ha encontrado su punto.

Además, puede optimizar su código iniciando el bucle por el lado más corto (considerando los lados AD y BD), ya que encontrará ese punto antes.


function getSpPoint(A,B,C){ var x1=A.x, y1=A.y, x2=B.x, y2=B.y, x3=C.x, y3=C.y; var px = x2-x1, py = y2-y1, dAB = px*px + py*py; var u = ((x3 - x1) * px + (y3 - y1) * py) / dAB; var x = x1 + u * px, y = y1 + u * py; return {x:x, y:y}; //this is D }