سؤال

أنا باستخدام .صافي تقديم طلب مع سطح الرسم ، على غرار Visio.واجهة المستخدم يربط بين اثنين من الكائنات على الشاشة مع الرسومات.DrawLine.هذا تنفيذ بسيط يعمل بشكل جيد, ولكن كما سطح يحصل أكثر تعقيدا ، أنا بحاجة إلى وسيلة أكثر قوة لتمثيل الكائنات.واحدة من هذه القوي متطلبات تحديد نقطة التقاطع على خطين حتى أنا يمكن أن تشير إلى الانفصال عن طريق نوع من الرسوم البيانية.

لذا سؤالي هو: هل يمكن لأي شخص أن يقترح طريقة للقيام بذلك ؟ ربما مع تقنية مختلفة (ربما GraphViz) أو خوارزمية ؟

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

المحلول

تمثيل خطوط y = mx + c إشكالية بالنسبة رسومات الحاسوب, لأن خطوط عمودية تتطلب م أن تكون لانهائية.

وعلاوة على ذلك, الخطوط في رسومات الحاسوب لديك نقطة بداية ونهاية ، على عكس خطوط رياضية التي هي غير نهائية في حد.واحد عادة ما تكون مهتمة فقط في عبور خطوط إذا كان عبور نقطة تقع على خط الشرائح في السؤال.

إذا كان لديك اثنين من قطاعات الخط ، واحدة من ناقلات x1 إلى x1+v1 واحد من ناقلات x2 x2+v2, ثم تحديد:

a = (v2.v2 v1.(x2-x1) - v1.v2 v2.(x2-x1)) / ((v1.v1)(v2.v2) - (v1.v2)^2)
b = (v1.v2 v1.(x2-x1) - v1.v1 v2.(x2-x1)) / ((v1.v1)(v2.v2) - (v1.v2)^2)

حيث ناقلات p=(px,py) ، q=(qx,qy) ، ص.q هو المنتج نقطة (بيكسل * qx + py * qy).تحقق أولا إذا (v1.v1)(v2.v2) = (v1.v2)^2 - إذا كان في خطوط متوازية ولا الصليب.

إذا أنها ليست موازية ، ثم إذا كان 0<=a<=1 و 0<=ب<=1, تقاطع نقطة تقع على كل من قطاعات الخط ، وتعطى من قبل نقطة

x1 + a * v1

تحرير اشتقاق المعادلات a و b على النحو التالي.نقطة التقاطع يرضي ناقلات المعادلة

x1 + a*v1 = x2 + b*v2

عن طريق أخذ نقطة نتاج هذه المعادلة مع v1, و مع v2, لدينا اثنين من المعادلات:

v1.v1*a - v2.v1*b = v1.(x2-x1)
v1.v2*a - v2.v2*b = v2.(x2-x1)

التي تشكل اثنين من المعادلات الخطية ل a و b.حل هذا النظام (بضرب المعادلة الأولى قبل v2.v2 الثانية قبل v1.v1 و طرح أو خلاف ذلك) يعطي المعادلات a و b.

نصائح أخرى

إذا كنت تدوير الإطار المرجعي الخاص بك لتتماشى مع الخط الأول الجزء (إذا الأصل هو الآن بداية من السطر الأول و ناقلات لأول خط يمتد على طول محور X) السؤال أين السطر الثاني ضرب X-axis في نظام الإحداثيات.هذا هو أسهل بكثير من السؤال إلى الجواب.إذا كان السطر الأول يسمى A ومن يحددها A.O أصل الخط 'A. V' يجري ناقلات الخط بحيث A.O + A.V هو نقطة نهاية الخط.الإطار المرجعي يمكن تعريف المصفوفة:

    | A.V.X   A.V.Y   A.O.X |
M = | A.V.Y  -A.V.X   A.O.Y |
    |   0       0       1   |

في الإحداثيات المتجانسة هذه المصفوفة يوفر أساسا الإطار المرجعي الذي خرائط خط A 0 إلى 1 على المحور السيني.يمكننا الآن تحديد تحويل خط B كما:

C.O = M*(B.O)
C.V = M*(B.O + B.V) - C.O

حيث * المشغل بشكل صحيح تحديد الإحداثيات المتجانسة (الإسقاط من 3 الفضائية على 2 الفضاء في هذه الحالة).الآن كل ما تبقى هو أن أرى أين C يضرب X-axis الذي هو نفس حل Y جانب من حدودي المعادلة C بالنسبة t:

C.O.Y + t * C.V.Y = 0
     -C.O.Y
t = --------
      C.V.Y

إذا t هو في النطاق من 0 إلى 1 ، C يضرب X-محور داخل الخط الجزء.المكان تقع على المحور السيني هو X جانب حدودي المعادلة C:

x = C.O.X + t * C.V.X

إذا x هو في النطاق من 0 إلى 1 ثم تقاطع على A شريحة خط.يمكننا بعد ذلك أن نجد نقطة في الأصل تنسيق النظام مع:

p = A.O + A.V * x

كنت بالطبع يجب أن تحقق أولا لمعرفة ما إذا كان أي جزء من خط الصفر طول.أيضا إذا C.V.Y = 0 لديك خط متوازي شرائح.إذا C.V.X هو أيضا صفر لديك colinear شرائح الخط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top