سؤال

كيف يمكنني رسم عمودي على قطعة مستقيمة من نقطة معينة؟يتم تعريف مقطع الخط الخاص بي على أنه (x1، y1)، (x2، y2)، إذا قمت برسم عمودي من نقطة (x3،y3) ويلتقي بالخط على النقطة (x4،y4).أريد معرفة ذلك (x4,y4).

هل كانت مفيدة؟

المحلول

وأنا حل المعادلات لك:

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 وسائل

نصائح أخرى

يكي :

<اقتباس فقرة>   

في الجبر، لأي معادلة خطية   ص = م × + ب، سوف العموديه جميع   يملك المنحدر من (-1 / م)، والعكس   معكوس المنحدر الأصلي. هذا   غير مفيدة لحفظ شعار "ل   العثور على منحدر عمودي   خط، والوجه الكسر وتغيير   توقيع ". نذكر أن أي عدد صحيح ل   هو في حد ذاته أكثر من واحد، ويمكن أن تكون مكتوبة   كما (أ / 1)

     

لتجد عمودي من معين   الخط الذي يمر أيضا من خلال   خاصة النقطة (س، ص)، حل   المعادلة ص = (-1 / م) س + ب، استبدال   في القيم المعروفة من م، س، و y ل   حل لب.

والمنحدر من الخط، م، من خلال (X1، Y1) و (X2، Y2) هو م = (Y1 - Y2) / (X1 - X2)

وأنا أتفق مع 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;

وسوف غالبا ما تجد أن استخدام ناقلات يجعل الحل أكثر وضوحا ...

وهنا هو روتين من مكتبة بلدي:

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);
}

وأنت تعرف كل من نقطة والمنحدر، وبالتالي فإن المعادلة للخط الجديد:

y-y3=m*(x-x3)

ونظرا لأن الخط هو عمودي، المنحدر هو المعاملة بالمثل السلبي. لديك الآن اثنين من المعادلات ويمكن أن تحل عن تقاطعها.

y-y3=-(1/m)*(x-x3)
y-y1=m*(x-x1)

احسب ميل الخط الذي يربط النقاط (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)

قم بحل هاتين المعادلتين الخطيتين أثناء حل معادلة خطية في متغيرين وستكون قيمتي x وy التي تحصل عليها هي (x4,y4)

آمل أن يساعد هذا.

هتافات

اكتشف المنحدرات لكلا الخطين ، قل أن المنحدرات هي M1 و M2 ثم م1*م2=-1 هو شرط ل عمودي.

ومطلب كود الوظيفة للمشكلة التالية

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

والرياضيات قدم RegionNearest[] وظيفة في الإصدار 10، يمكن أن تستخدم 2014. هذه الوظيفة في العودة جوابا على هذا السؤال:

{x4,y4} = RegionNearest[Line[{{x1,y1},{x2,y2}}],{x3,y3}]

وهذا هو في الغالب نسخة مكررة من الإجابة Arnkrishn ل. أردت فقط لاستكمال الجزء الخاص به مع كامل البرمجية المتكررة الرياضيات:

m = (y2 - y1)/(x2 - x1)
eqn1 = y - y3 == -(1/m)*(x - x3)
eqn2 = y - y1 == m*(x - x1)
Solve[eqn1 && eqn2, {x, y}]

وهذا هو C # تنفيذ إجابة مقبولة. كما انها تستخدم نظام ArcGIS لإرجاع ل MapPoint كما أن ما نستخدمه لهذا المشروع.

        private MapPoint GenerateLinePoint(double startPointX, double startPointY, double endPointX, double endPointY, double pointX, double pointY)
        {
            double k = ((endPointY - startPointY) * (pointX - startPointX) - (endPointX - startPointX) * (pointY - startPointY)) / (Math.Pow(endPointY - startPointY, 2) 
                + Math.Pow(endPointX - startPointX, 2));
            double resultX = pointX - k * (endPointY - startPointY);
            double resultY = pointY + k * (endPointX - startPointX);

            return new MapPoint(resultX, resultY, 0, SpatialReferences.Wgs84);
        }

وبفضل راي لأن ذلك عملت تماما بالنسبة لي. <فئة = "بعد الكود "أ href =" / الأسئلة / المعلمة / نظام ArcGIS "عنوان =" الأسئلة المعرض الموسومة "نظام ArcGIS" يختلط = "العلامة"> نظام ArcGIS

وهذه هي وظيفة ماتلاب vectorized لإيجاد توقعات البشرى من النقاط m على قطاعات خط n. هنا xp وyp هي ناقلات m by 1 عقد إحداثيات m نقاط مختلفة، وx1، y1، x2 وy2 وناقلات n by 1 عقد إحداثيات نقطة بداية ونهاية من n قطاعات خط مختلفة. وتعود المصفوفات m by n، x وy، حيث x(i, j) وy(i, j) هي إحداثيات إسقاط نقطة i عشر على خط j عشر.

ويتم العمل الفعلي في الأسطر القليلة الأولى وبقية ظيفة يدير عرض الاختبار الذاتي، فقط في حالة حيث يطلق عليه بدون أي معلمة. انها سريعة نسبيا، تمكنت من العثور التوقعات من النقاط 2K على قطاعات خط 2K في أقل من 0.05S.

function [x, y] = projectPointLine(xp, yp, x1, y1, x2, y2)
if nargin > 0
        xd = (x2-x1)';
    yd = (y2-y1)';
    dAB = xd.*xd + yd.*yd;
    u = bsxfun(@rdivide, bsxfun(@times, bsxfun(@minus, xp, x1'), xd) + ...
        bsxfun(@times, bsxfun(@minus, yp, y1'), yd), dAB);
    x = bsxfun(@plus, x1', bsxfun(@times, u, xd));
    y = bsxfun(@plus, y1', bsxfun(@times, u, yd));
else
    nLine = 3;
    nPoint = 2;
    xp = rand(nPoint, 1) * 2 -1;
    yp = rand(nPoint, 1) * 2 -1;
    x1 = rand(nLine, 1) * 2 -1;
    y1 = rand(nLine, 1) * 2 -1;
    x2 = rand(nLine, 1) * 2 -1;
    y2 = rand(nLine, 1) * 2 -1;
    tic;
    [x, y] = projectPointLine(xp, yp, x1, y1, x2, y2);
    toc
    close all;
    plot([x1'; x2'], [y1'; y2'], '.-', 'linewidth', 2, 'markersize', 20);
    axis equal;
    hold on
    C = lines(nPoint + nLine);
    for i=1:nPoint
        scatter(x(i, :), y(i, :), 100, C(i+nLine, :), 'x', 'linewidth', 2);
        scatter(xp(i), yp(i), 100, C(i+nLine, :), 'x', 'linewidth', 2);
    end
    for i=1:nLine
        scatter(x(:, i)', y(:, i)', 100, C(i, :), 'o', 'linewidth', 2);
    end
end
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top