كيف يمكنك العثور على نقطة معينة عمودي المسافة من الخط ؟

StackOverflow https://stackoverflow.com/questions/133897

سؤال

لدي خط أنني ألفت في النافذة وأنا السماح للمستخدم سحب حولها.حتى خط ويعرف نقطتين:(x1,y1) و (x2,y2).ولكن الآن أود أن ألفت "قبعات" في نهاية الخط ، التي هي قصيرة خطوط عمودية في كل نقطة النهاية.يجب أن يكون قبعات ن بكسل في الطول.

وهكذا رسم بلدي "كاب" خط في نهاية النقطة (x1,y1), كنت بحاجة إلى العثور على اثنين من النقاط التي تشكل خط عمودي ، حيث كل من النقاط N/2 بكسل بعيدا عن النقطة (x1,y1).

إذا كيف يمكنك حساب نقطة (x3,y3) نظرا لأنه يحتاج إلى أن يكون في مسافة عمودية N/2 بعيدا عن نقطة النهاية (x1,y1) من المعروف الخط ، أيخط يحددها (x1,y1) و (x2,y2)?

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

المحلول

تحتاج إلى حساب وحدة ناقل عمودي على خط مستقيم.تجنب الحوسبة المنحدر لأن ذلك يمكن أن يؤدي إلى القسمة على صفر من الأخطاء.

dx = x1-x2
dy = y1-y2
dist = sqrt(dx*dx + dy*dy)
dx /= dist
dy /= dist
x3 = x1 + (N/2)*dy
y3 = y1 - (N/2)*dx
x4 = x1 - (N/2)*dy
y4 = y1 + (N/2)*dx

نصائح أخرى

أنت فقط تقييم متعامد versor وتتكاثر N/2

vx = x2-x1
vy = y2-y1
len = sqrt( vx*vx + vy*vy )
ux = -vy/len
uy = vx/len

x3 = x1 + N/2 * ux
Y3 = y1 + N/2 * uy

x4 = x1 - N/2 * ux
Y4 = y1 - N/2 * uy

منذ ناقلات من 2 الى 1 ومن 1 إلى 3 عمودي ، دوت المنتج هو 0.

هذا يترك لك مع اثنين من المجاهيل:x من 1 إلى 3 (x13) ، y من 1 إلى 3 (y13)

استخدام نظرية فيثاغورس للحصول على معادلة أخرى عن هؤلاء المجاهيل.

حل لكل معروف من قبل الاستبدال...

وهذا يتطلب التوفيق و unsquaring ، حتى تفقد علامة المرتبطة المعادلات الخاصة بك.

لتحديد علامة ، ينظر:

while x21 is negative, y13 will be positive
while x21 is positive, y13 will be negative
while y21 is positive, x13 will be positive
while y21 is negative, x13 will be negative

المعروف:النقطة 1 :x1 , y1

المعروف:النقطة 2 :x2 , y2

x21 = x1 - x2
y21 = y1 - y2

المعروف:المسافة |1->3| :ن/2

المعادلة a:نظرية فيثاغورس

x13^2 + y13^2 = |1->3|^2
x13^2 + y13^2 = (N/2)^2

المعروف:زاوية 2-1-3 :زاوية الحق

ناقلات 2->1 و 1->3 عمودي

2->1 نقطة 1->3 0

المعادلة ب:المنتج نقطة = 0

x21*x13 + y21*y13 = 2->1 dot 1->3
x21*x13 + y21*y13 = 0

نسبة ب/ث x13 و y13:

x21*x13 = -y21*y13
x13 = -(y21/x21)y13

x13 = -phi*y13

المعادلة a:حل y13 مع نسبة

  plug x13 into a
phi^2*y13^2 + y13^2 = |1->3|^2

  factor out y13
y13^2 * (phi^2 + 1) = 

  plug in phi
y13^2 * (y21^2/x21^2 + 1) = 

  multiply both sides by x21^2
y13^2 * (y21^2 + x21^2) = |1->3|^2 * x21^2

  plug in Pythagorean theorem of 2->1
y13^2 * |2->1|^2 = |1->3|^2 * x21^2

  take square root of both sides
y13 * |2->1| = |1->3| * x21

  divide both sides by the length of 1->2
y13 = (|1->3|/|2->1|) *x21

  lets call the ratio of 1->3 to 2->1 lengths psi
y13 = psi * x21

  check the signs
    when x21 is negative, y13 will be positive
    when x21 is positive, y13 will be negative

y13 = -psi * x21

المعادلة a:حل x13 مع نسبة

  plug y13 into a
x13^2 + x13^2/phi^2 = |1->3|^2

  factor out x13
x13^2 * (1 + 1/phi^2) = 

  plug in phi
x13^2 * (1 + x21^2/y21^2) = 

  multiply both sides by y21^2
x13^2 * (y21^2 + x21^2) = |1->3|^2 * y21^2

  plug in Pythagorean theorem of 2->1
x13^2 * |2->1|^2 = |1->3|^2 * y21^2

  take square root of both sides
x13 * |2->1| = |1->3| * y21

  divide both sides by the length of 2->1
x13 = (|1->3|/|2->1|) *y21

  lets call the ratio of |1->3| to |2->1| psi
x13 = psi * y21

  check the signs
    when y21 is negative, x13 will be negative
    when y21 is positive, x13 will be negative

x13 = psi * y21

تتكثف

x21 = x1 - x2
y21 = y1 - y2

|2->1| = sqrt( x21^2 + y^21^2 )
|1->3| = N/2

psi = |1->3|/|2->1|

y13 = -psi * x21
x13 =  psi * y21

أنا عادة لا تفعل هذا, لكني حلها في العمل و يعتقد أن تشرح بدقة سوف يساعدني في ترسيخ معرفتي.

إذا كنت ترغب في تجنب الجذر التربيعي ، القيام بما يلي:

in: line_length, cap_length, rotation, position of line centre

define points:
  tl (-line_length/2, cap_length)
  tr (line_length/2, cap_length)
  bl (-line_length/2, -cap_length)
  br (line_length/2, -cap_length)

rotate the four points by 'rotation'
offset four points by 'position'

drawline (midpoint tl,bl to midpoint tr,br)
drawline (tl to bl)
drawline (tr to br)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top