algorithm - applications - computational geometry中文




如何計算鏡像點沿線? (4)

我假設你有點的位置,並為你的線,即方程

P=(x1,y1) and y = ax + b

首先是a = 0(即與x軸平行的線)產生的明顯情況

P'(x2,y2), with x2 = x1, y2 = y1 + 2(b-y1)

對於更一般的情況,

  1. 得到與你的直線正交的通用方程:y = cx + d,ac = -1

    ==> c = -1 / a

  2. 確定b使得P屬於正交線:y1 = -x1 / a + d

    ==> d = y1 + x1 / a

  3. 得到兩條線的交點:y = -x / a + y1 + x1 / a = ax + b

    ==> x =(y1 + x1 / a -b)/(a + 1 / a),y = a(y1 + x1 / a -b)/(a + 1 / a)+ b

  4. 得到交點和你的點P之間的矢量,把它加到交點得到鏡像點P'。

    (y1 + x1 / a -b)/(a + 1 / a)-x1)y2 = y1 + 2(a1 + x1 / a -b)/(a + 1 / a)+ b-y1)

有些步驟可以簡化,但這是一般的想法。 打字時我做了代數,所以可能會有錯誤。 如果你找到一個,請讓我知道。

在2D平面上,我有一個點和一條線。 如何得到沿這條線的鏡像點?


我已經完成了這個為我建立的另一個系統..在我的代碼還有很多, 所以我希望我已經提取了所有必要的位... Line.ClosestPoint(Point pt)是你想要的方法...

該算法基於以下想法:任何給定線的垂直線的斜率是給定線的斜率的負乘法倒數。 即如果一條線的斜率為m,則另一條線的斜率為-1 / m。 所以你所要做的就是通過斜率等於-1 / m的點形成一條直線,找到這條直線與原始直線的交點。

public class Line
{
    protected const double epsilon = 1.0e-8;

    public Point Anchor { get; set; }

    public double Slope { get; set; }

    public virtual Point ClosestPoint(Point pt)
    { return Intersection(Make(pt, -1 / Slope)); }

    protected Line(Point anchor, double slope)
    {
        Anchor = anchor;
        Slope = slope;
    }

    public static Line Make(Point anchor, double slope)
    { return new Line(anchor, slope); }

    public virtual Point Intersection(Line line)
    {
        if (lib.Within(line.Slope, Slope, epsilon))              
            if( lib.Within(line.YIntcpt, YIntcpt, epsilon))
                // code for NoInterceptException not included
                throw new NoInterceptException(
                    "The two lines overlap.");
            else return Point.NullPoint;
        // ----------------------------------------
        double tm = Slope, om = line.Slope,
            tx = Anchor.X, ty = Anchor.Y,
            ox = line.Anchor.X, oy = line.Anchor.Y;

        var x = double.IsInfinity(tm) ? tx :
                double.IsInfinity(om) ? ox :
                   (tm * tx - om * ox + oy - ty) /
                          (tm - om);

        var y = double.IsInfinity(tm) ?
               om * (x - ox) + oy :
               tm * (x - tx) + ty;

        return Point.Make(x, y);
    }
}

public struct Point
{
    const double epsilon = 1.0e-12;
    private readonly bool isDef;
    private readonly double y;
    private readonly double x;
    public bool HasValue { get { return isDef; } }
    public bool IsNull { get { return !isDef; } }

    private Point(double xValue, double yValue)
    { x = xValue; y = yValue; isDef = true; }
    public static Point Make(double x, double y)
    { return new Point(x, y); }

    public double X 
    {
        get
        {
                  // code for AlgebraicException not included
            if (IsNull) throw new AlgebraicException("Null Point Object"); 
            return x;
        }
    }
    public double Y
    {
        get
        {
                  // code for AlgebraicException not included
            if (IsNull) throw new AlgebraicException("Null Point Object");
            return y;
        }
    }

    public static Point NullPoint { get { return new Point();}}

    //  Other functionality

} 

細節取決於你的線路如何表現。 如果將它表示為線上的任意點P和沿著該線的單位列向量n ,則任意點Q的鏡像點Q '由下式給出:

Q '= Q + 2(I - nn T )( P - Q

(這裡,I是2×2單位矩陣, n Tn的轉置矩陣(將n視為2×1矩陣), nn T是由nn T的標準矩陣乘法形成的2×2矩陣。)表明如果你將P移動到任何位置, Q '將不會改變。

將其他線表示轉換為點/單位矢量表示並不困難。


計算線上最近的點到有問題的點。 然後反轉這些點之間的矢量方向,並將其添加到線上最近的點。 Voilà,你已經找到了鏡像點。





computational-geometry