41

特定の点から線分に垂線を引くにはどうすればよいですか? 私の線分は (x1, y1), (x2, y2) として定義されます。点 (x3,y3) から垂線を引き、それが点 (x4,y4) の線に交わるとします。これ(x4,y4)を知りたい。

4

14 に答える 14

71

私はあなたのために方程式を解きました:

k = ((y2-y1) * (x3-x1) - (x2-x1) * (y3-y1)) / ((y2-y1)^2 + (x2-x1)^2)
x4 = x3 - k * (y2-y1)
y4 = y3 + k * (x2-x1)

^2 は 2 乗を意味します

于 2009-11-28T05:07:04.747 に答える
19

ウィキから:

代数では、任意の線形方程式 y=mx + b に対して、垂線はすべて (-1/m) の勾配を持ち、元の勾配の逆数になります。「垂線の傾きを求め、分数をひっくり返して符号を変える」というスローガンを覚えておくと役に立ちます。任意の整数 a はそれ自体が 1 より大きく、(a/1) のように書けることを思い出してください。

特定の点 (x, y) も通過する特定の直線の垂線を見つけるには、式 y = (-1/m)x + b を解き、m、x、および y の既知の値を代入して、 bの場合。

(x1, y1) と (x2, y2) を通る線 m の傾きは、m = (y1 - y2) / (x1 - x2) です。

于 2009-11-28T04:29:41.547 に答える
11

私はpeter.murray.rustに同意します。ベクトルは解決策をより明確にします:

// first convert line to normalized unit vector
double dx = x2 - x1;
double dy = y2 - y1;
double mag = sqrt(dx*dx + dy*dy);
dx /= mag;
dy /= mag;

// translate the point and get the dot product
double lambda = (dx * (x3 - x1)) + (dy * (y3 - y1));
x4 = (dx * lambda) + x1;
y4 = (dy * lambda) + y1;
于 2014-01-10T22:29:44.300 に答える
8

ベクトルを使用すると、ソリューションがより明確になることがよくあります...

これは私自身のライブラリからのルーチンです:

public class Line2  {

Real2 from;
Real2 to;
Vector2 vector;
Vector2 unitVector = null;


    public Real2 getNearestPointOnLine(Real2 point) {
        unitVector = to.subtract(from).getUnitVector();
        Vector2 lp = new Vector2(point.subtract(this.from));
        double lambda = unitVector.dotProduct(lp);
        Real2 vv = unitVector.multiplyBy(lambda);
        return from.plus(vv);
    }

}

Real2 (ポイント) と Vector2 と dotProduct() を実装する必要がありますが、これらは単純なはずです。

コードは次のようになります。

Point2 p1 = new Point2(x1, y1);
Point2 p2 = new Point2(x2, y2);
Point2 p3 = new Point2(x3, y3);
Line2 line = new Line2(p1, p2);
Point2 p4 = getNearestPointOnLine(p3);

ライブラリ (org.xmlcml.euclid) は次の場所にあります: http://sourceforge.net/projects/cml/

このメソッドを実行し、その使用方法を示す単体テストがあります。

@Test
public final void testGetNearestPointOnLine() {
    Real2 p = l1112.getNearestPointOnLine(new Real2(0., 0.));
    Real2Test.assertEquals("point", new Real2(0.4, -0.2), p, 0.0000001);
}
于 2009-11-28T04:45:09.480 に答える
7

点と勾配の両方がわかっているので、新しい線の方程式は次のとおりです。

y-y3=m*(x-x3)

線は垂直なので、傾きは負の逆数です。これで 2 つの方程式ができ、それらの交点を解くことができます。

y-y3=-(1/m)*(x-x3)
y-y1=m*(x-x1)
于 2009-11-28T04:31:53.460 に答える
3

点 (x1,y1) と (x2,y2) を結ぶ直線の傾きを次のように計算します。m=(y2-y1)/(x2-x1)

(x1,y1) と (x2,y2) を結ぶ直線の式は、点と勾配の形式の直線の式を使用して、次のようになります。y-y2 = m(x-x2)

(x3,y3) と (x4,y4) を結ぶ直線の傾きは-(1/m)

繰り返しますが、(x3,y3) と (x4,y4) を結ぶ直線の式は、点と勾配の形式の直線を使用して次のようになります。y-y3 = -(1/m)(x-x3)

2 つの変数で線形方程式を解くように、これらの 2 つの線形方程式を解きます。得られる x と y の値は (x4,y4) になります。

これが役立つことを願っています。

乾杯

于 2009-11-28T04:45:19.270 に答える
2

次の問題の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
于 2016-03-09T11:46:55.720 に答える
2

両方の線の傾きを調べます。傾きが m1 と m2 の場合、 m1*m2=-1が垂直の条件です。

于 2009-11-28T04:31:03.197 に答える
1

MathematicaRegionNearest[]は2014年のバージョン10でこの関数を導入しました.この関数は次の質問に対する答えを返すために使用できます.

{x4,y4} = RegionNearest[Line[{{x1,y1},{x2,y2}}],{x3,y3}]
于 2017-01-10T01:47:08.350 に答える
1

これは、主に Arkrishn の回答の複製です。完全な Mathematica コード スニペットで彼のセクションを完成させたかっただけです。

m = (y2 - y1)/(x2 - x1)
eqn1 = y - y3 == -(1/m)*(x - x3)
eqn2 = y - y1 == m*(x - x1)
Solve[eqn1 && eqn2, {x, y}]
于 2017-01-10T04:49:16.477 に答える