2011-03-07 23 views
6

का चौराहे बिंदु प्राप्त करें मुझे आयत और रेखा के चौराहे बिंदु की आवश्यकता है। मेरे पास आयताकार (आयताकार केंद्र) के अंदर बिंदु बी है और इसके बाहर बिंदु ए है। और मुझे आयताकार सीमाओं में से एक बिंदु बिंदु को खोजने की जरूरत है। इसके अलावा मुझे आयताकार की चौड़ाई और ऊंचाई मिलती है।आयत और रेखा

enter image description here

यह सब, WPF आवेदन किया है, इसलिए यदि कार्यों में किसी भी निर्माण मैं बहुत खुश होंगे होगा।

+2

एक आयताकार केवल 4 लाइनें है। 4 बार लाइन/लाइन चौराहे परीक्षण लागू करें। –

+0

संभावित डुप्लिकेट [लाइन और आयताकार के बीच चौराहे बिंदु कैसे प्राप्त करें?] (Http://stackoverflow.com/questions/1585525/how-to-find-the-intersection-point-between-a-line- और एक आयताकार) – Gajus

उत्तर

2

समाधान, WPF:

/// <summary> 
    /// Get Intersection point 
    /// </summary> 
    /// <param name="a1">a1 is line1 start</param> 
    /// <param name="a2">a2 is line1 end</param> 
    /// <param name="b1">b1 is line2 start</param> 
    /// <param name="b2">b2 is line2 end</param> 
    /// <returns></returns> 
    public static Vector? Intersects(Vector a1, Vector a2, Vector b1, Vector b2) 
    { 
     Vector b = a2 - a1; 
     Vector d = b2 - b1; 
     var bDotDPerp = b.X * d.Y - b.Y * d.X; 

     // if b dot d == 0, it means the lines are parallel so have infinite intersection points 
     if (bDotDPerp == 0) 
      return null; 

     Vector c = b1 - a1; 
     var t = (c.X * d.Y - c.Y * d.X)/bDotDPerp; 
     if (t < 0 || t > 1) 
      { 
      return null; 
     } 

     var u = (c.X * b.Y - c.Y * b.X)/bDotDPerp; 
     if (u < 0 || u > 1) 
     { 
      return null; 
     } 

     return a1 + t * b; 
    } 

संपादित मिले Link एसओ को सवाल जहां जवाब ऊपर से आता है।

3

यह बुनियादी गणित हल लाइन लाइन चौराहे, टोपकोडर की जाँच एक tutorial के लिए है:

लाइन लाइन चौराहे सबसे सामान्य कार्यों में से एक आप ज्यामिति में समस्याओं मिलेगा लाइन चौराहे है। के बावजूद तथ्य यह है कि यह बहुत आम है, कोडर के बहुत सारे अभी भी इसके साथ परेशानी है। पहला सवाल यह है कि किस प्रकार के रूप में हमने अपनी लाइनें दी हैं, और क्या फॉर्म हम उन्हें पसंद करेंगे? आदर्श रूप से, हमारी लाइनों के प्रत्येक फॉर्म एक्स + बी = सी में होंगे, जहां ए, बी और सी संख्याएं हैं जो रेखा को परिभाषित करती हैं। हालांकि, हमें शायद ही कभी में इस प्रारूप को लाइनें दी गई हैं, लेकिन हम आसानी से दो अंकों से इस तरह के समीकरण उत्पन्न कर सकते हैं। मान लें कि हमें दो अलग अंक, (x1, y1) और (x2, y2), और समीकरण के लिए ए, बी और सी ढूंढना चाहते हैं। हम एक = y2-y1 बी = x 1-x2 सी की स्थापना करके कर सकते हैं = ए * x 1 + बी * y1

+1

यह मेरी विधि से बहुत तेज होना चाहिए। +1 –

+1

वह सूत्र बिल्कुल समझ में नहीं आता है। ए, बी, और सी सभी अंक होना चाहिए और जो एकल मान उत्पन्न करता है। – msarchet

+3

@msarchet: यह केवल एल्गोरिदम का एक हिस्सा है, और ए, बी और सी के प्रश्न के मुकाबले ट्यूटोरियल में अलग-अलग अर्थ हैं। –

3
WPF बिना जाने

, या अपने कार्यों के किसी भी, यह कैसे मैं यह करना होगा है :

  1. कि बी और सी
  2. सीडी की लंबाई के बाद से बी आयत के केंद्र में है पता होना चाहिए के बीच एक सही कोण बनाता है एक अस्थायी बिंदु डी बनाएँ। इसलिए, बीडी की लंबाई की गणना करना आसान होना चाहिए।
  3. एससीआरटी (बीडी)^2 + (सीडी)^2 द्वारा बीसी की लंबाई निर्धारित करें।
  4. ए की स्थिति को देखते हुए, आप जानते हैं कि सी आयत के किनारे के पहले या बाद में है या नहीं। इसलिए, आप पक्ष की सी की स्थिति की गणना करने के लिए बीसी की लंबाई का उपयोग कर सकते हैं।
1

आप आयत के आयाम है, जो मैं तुम क्या "

  • rX आयत चौड़ाई
  • rY आयत ऊंचाई
  • Ay एक के Y स्थिति
  • Ax एक के X स्थिति मान पता है
  • By बी की वाई स्थिति
  • Bx बी के X स्थिति
  • Cy सी Y स्थिति
  • Cx सी X स्थिति

Cy = By + rY/2

सी स्थिति, आयत के शीर्ष पर है, इसलिए यह तक स्थिति है + आरवाई स्थिति का आधा

तब हमें Cx स्थिति की गणना करने की आवश्यकता है।

Cx = (Bx + ((Ax - Bx)/(Ay - By)) * Cy)

आप Point

2

का उपयोग कर कुल्हाड़ी के साथ और एक के निर्देशांक, और bx ay, बी के निर्देशांक द्वारा, और यह सोचते हैं द्वारा एक्स और एक वाई के लिए Coordiantes और बी प्राप्त कर सकते हैं चौड़ाई w और ऊंचाई एच के साथ आयत के केंद्र {0,0} पर है निम्नलिखित

IntersectionRectangleLine[{ax_, ay_}, {bx_, by_}, h_, w_] := 
    Module[{\[Mu]r, \[Mu]l, \[Mu]t, \[Mu]b}, 
    {\[Mu]r, \[Mu]l, \[Mu]t, \[Mu]b} = {-((-2 ay bx + 2 ax by - ax w + 
     bx w)/((ay - by) h)), -((-2 ay bx + 2 ax by + ax w - 
     bx w)/((ay - by) h)), -((
    2 ay bx - 2 ax by - ay h + by h)/((ax - bx) w)), -((
    2 ay bx - 2 ax by + ay h - by h)/((ax - bx) w))}; 
Which[ 
    -1 <= \[Mu]r <= 1, {0, w/2} + \[Mu]r {h/2, 0}, 
    -1 <= \[Mu]l <= 1, {0, -w/2} + \[Mu]l {h/2, 0}, 
    -1 <= \[Mu]t <= 1, {h/2, 0} + \[Mu]t {0, w/2}, 
    -1 <= \[Mu]b <= 1, {-h/2, 0} + \[Mu]b {0, w/2} 
] 
] 

यह काम करना चाहिए त्रिकोण

0,123,516 बनाने चार लाइनें के चौराहे के लिए समाधान के आधार पर
In[114]:= Solve[Thread[\[Lambda] ({bx, by} - {ax, ay}) + {ax, ay} == {0, w/2} + \[Mu] {h/2, 0}], \[Mu], {\[Lambda]}] 

Out[114]= {{\[Mu] -> -((-2 ay bx + 2 ax by - ax w + bx w)/((ay - by) h))}} 

(यहां एक उदाहरण के रूप में शीर्ष पंक्ति)।

और Evgeny के लिए, यह मेरी स्क्रीन पर कैसा दिखता है। काफी ज्यादा पठनीय। सी # के लिए

prettier version of code

+1

जब मैं प्रश्न पढ़ता हूं तो इसे गणितिका टैग किया गया था। इसे तब से हटा दिया गया है। मुझे बेलिसियस द्वारा लगता है। मैं मानता हूं कि यह गणित की समस्या नहीं है। –

+1

क्या गड़बड़ है। यह कौनसी भाषा है? – Evgeny

+0

क्षमा करें अगर टैग के साथ कुछ गलतफहमी। मेरे लिए गणित विज्ञान है ... – Evgeny

संबंधित मुद्दे