2010-02-08 23 views
8

अरे दोस्तों, मैं प्रसंस्करण.जेएस सीख रहा हूं, और मैं गणितीय समस्या में आया हूं, जिसे मैं अपने सीमित ज्यामिति और त्रिकोणमिति ज्ञान या विकिपीडिया की सहायता से हल नहीं कर सकता।एक आयताकार के दो बिंदुओं को जानना, मैं दूसरे दो को कैसे समझ सकता हूं?

मुझे आयताकार खींचने की आवश्यकता है। इस आयताकार को आकर्षित करने के लिए, मुझे प्रत्येक कोने के समन्वय बिंदुओं को जानने की आवश्यकता है। मुझे पता है कि एक्स और वाई बॉक्स के ऊपर और नीचे के मध्यबिंदुओं और चारों तरफ की लंबाई के लिए है।

बॉक्स के अभिविन्यास पर कोई गारंटी नहीं है।

कोई मदद? ऐसा लगता है कि यह आसान होना चाहिए, लेकिन यह वास्तव में मुझे रोक रहा है।

+0

मैं अपने जवाब को वापस ले .. यह हल करने योग्य है! – Dolph

+0

मुझे लगता है कि इसे किसी भी कोण पर घुमाया जा सकता है और आप कोण को नहीं जानते? – Casey

+0

@ कैसी, सही। – icco

उत्तर

8

यदि यह चतुर्भुज एक आयत है (सभी चार कोण 90 डिग्री हैं), तो इसे हल किया जा सकता है। (यदि यह कोई चतुर्भुज हो सकता है, तो यह हल करने योग्य नहीं है)

यदि अंक हैं (x1, y1), और (x2, y2), और यदि दोनों बिंदु पूरी तरह लंबवत नहीं हैं (x1 = x2) या क्षैतिज (y1 = y2), तो आयत के एक किनारे की ढलान

m1 = (y2-y1)/(x2-x1) 

है और दूसरे किनारे की ढलान है:

m2 = - 1/m1 

आप भुजाओं की लम्बाई पता है, और दो विपरीत पक्षों के मध्यबिंदुओं, फिर corrner अंक dx जोड़कर आसानी से निर्धारित किया जाता है, मध्य बिंदुओं के लिए डीई: (यदि एल लंबाई है अंक लंबवत या क्षैतिज गठबंधन कर रहे हैं, इस तकनीक काम नहीं करेगा, हालांकि उन अपक्षयी मामलों के लिए स्पष्ट समाधान है: पक्षों कि मध्य बिन्दुओं पर हैं)

dx = Sqrt(L^2/(1 + m2^2))/2 

और

dy = m2 * dx 

नोट की बहुत आसान

+0

बहुत बढ़िया। यही वह चीज है जिसकी मुझे जरूरत थी। धन्यवाद। – icco

+0

इस विधि के साथ आपको यह सुनिश्चित करना होगा कि आप 'x1 == x2' या 'y1 == y2' के लिए विशेष मामलों को जोड़ दें अन्यथा आप शून्य से विभाजित कर देंगे।ढलानों के बजाय वैक्टरों के साथ गणना करना इससे बचाता है (हालांकि आपको अभी भी यह जांचना होगा कि आपके दो बिंदु बिल्कुल समान नहीं हैं)। – Dave

+0

@ डेव, सही, महोदय, मैंने इस मामले को हल करने के लिए अपना जवाब संपादित कर लिया है। –

0

यह निश्चित रूप से एक आयताकार है? फिर आप छोटी तरफ के अभिविन्यास को जानते हैं (वे आपके बिंदुओं के बीच की रेखा के समानांतर हैं), और इसलिए लंबे पक्षों का अभिविन्यास।

आप लंबी तरफ के अभिविन्यास और लंबाई को जानते हैं, और आप उनके मध्यबिंदुओं को जानते हैं, इसलिए वहां से कोनों को ढूंढना सीधा है।

कार्यान्वयन पाठक के लिए एक अभ्यास के रूप में छोड़ा गया है।

+0

लंबे पक्ष एक पंक्ति के समानांतर हैं जो मुझे हां पता है। मैं छोटी तरफ और उनकी ढलान की लंबाई भी जानता हूं, क्योंकि मुझे उनके लिए लंबवत एक रेखा की ढलान पता है। मुझे अभी भी पता नहीं है कि उन चार अंक कैसे प्राप्त करें। शायद यह आपके लिए आसान लगता है, लेकिन मेरे पास बहुत कम गणितीय पृष्ठभूमि है। – icco

+0

आप मध्यबिंदु को जानते हैं, और किनारे की लंबाई यह मध्यबिंदु है। इसका मतलब है कि उस बिंदु से कोने 'लंबाई/2' दूर है। तो आप दिशा जानते हैं, और आप दूरी जानते हैं ... आपको और जानने की क्या ज़रूरत है? –

0

इसका मतलब है कि आपके पास दो बिंदुओं के बीच रेखा के समानांतर दो पंक्तियां होंगी। आपके पास लाइन के अनुवाद से प्रत्येक दिशा में शीर्ष दिशा की लंबाई 1/2 की रेखा का अनुवाद करके कोनों को प्राप्त करें।

0

यदि आप शीर्ष के लिए मिडपॉइंट और शीर्ष की लंबाई जानते हैं, तो आप जानते हैं कि वाई दोनों शीर्ष कोनों के लिए समान रहेगा, और एक्स मिडपॉइंट प्लस/आयत की चौड़ाई होगी । यह नीचे के लिए भी सच होगा।

एक बार आपके चार कोनों के बाद, पक्ष की लंबाई के बारे में चिंता करने की आवश्यकता नहीं है, क्योंकि उनके अंक शीर्ष और नीचे के लिए उपयोग किए जाने वाले समान हैं।

      midpoint 
    x,10     10,10     x,10 
     *--------------------------------------------* 
         width = 30 

    mx = midpoint x. 
    top left corner = (w/2) - mx or 15 - 10 
    top left corner coords = -5,10 

    mx = midpoint x. 
    top right corner = (w/2) + mx or 15 + 10 
    top left corner coords = 25,10 
+0

यह बॉक्स अज्ञात कोण पर है, मैं कैसे मान सकता हूं कि y वही रहेगा? – icco

0

"चतुर्भुज" और "आयताकार" के बीच एक अंतर है।

यदि आपके पास ऊपर और नीचे का मध्यबिंदु है, और पक्ष की लंबाई, बाकी सरल है।

को देखते हुए: दाएँ/बाएँ लंबाई के साथ

(x1, y1) -- (top_middle_x, top_middle_y) -- (x2, y1) 

(x1, y2) -- (btm_middle_x, btm_middle_y) -- (x2, y2) 

और ऊपर/नीचे लंबाई।

x1 = top_middle_x - top/bottom_length/2; x2 = x1 + top/bottom_length;

y1 = top_middle_y y2 = bottom_middle_y

जाहिर है, कि सबसे सामान्य स्थिति है और यह सोचते हैं कि (TMX, tmy) (BMX, BMY) की लाइन पूरी तरह से वाई अक्ष के साथ है।

हम उस पंक्ति को "मध्य रेखा" कहते हैं।

अगली चाल मध्य रेखा को लेना है, और वाई अक्ष से इसकी घूर्णन ऑफसेट की गणना करना है।

अब, मेरी ट्रिगर सुपर जंगली है।

dx = tmx - bmx, dy = tmy - bmy।

तो, कोण का स्पर्शक डीई/डीएक्स है। आर्कटैंजेंट (डीई/डीएक्स) लाइन का कोण है।

इससे आप अपना अभिविन्यास प्राप्त कर सकते हैं। एक बार जब आप उन्मुखीकरण है, तो आप "घूर्णन" लाइन कर सकते हैं

-

(लेकिन यह यह का सार है मन, वहाँ चतुर्थ भाग के साथ कुछ खेल, और संकेत, और सामान को यह अधिकार प्राप्त करने के लिए है।) वाई अक्ष पर वापस। गणित के लिए 2 डी ग्राफिक्स देखें, यह सीधे आगे है।

यह आपको अपना सामान्य अभिविन्यास प्राप्त करता है। फिर आयताकार बिंदुओं की गणना करें, इस नए सामान्य रूप में, और अंत में, उन्हें वापस घुमाएं।

विओला। आयत।

अन्य चीजें जो आप कर सकते हैं वह "पंक्ति" को "घुमाएं" है जो "शीर्ष" रेखा की आधा लंबाई है जहां यह मध्य रेखा का 9 0 डिग्री है। तो, कहें कि आपके पास मध्य रेखा है जो 45 डिग्री है। आप इस लाइन को tmx, tmy पर शुरू करेंगे, और इस पंक्ति को 135 डिग्री (90 + 45) घुमाएं। वह बिंदु आपका "ऊपरी बाएं" कोने होगा। "शीर्ष दाएं" बिंदु प्राप्त करने के लिए इसे -45 (45 - 9 0) घुमाएं। फिर निचले बिंदुओं के साथ कुछ ऐसा करें।

0

दो मध्यबिंदुओं में शामिल होने वाले रेखा के कोण की गणना करें जो वेक्टर के बीच आपके द्वारा प्राप्त किए गए वेक्टर पर लागू होते हैं।

घटाना है कि कोण से 90 डिग्री ऊपरी किनारे

शीर्ष केंद्र बिंदु से शुरू की दिशा प्राप्त करने के लिए, ले जाने के रिश्तेदार (1/2 शीर्ष चौड़ाई x पाप (कोण), 1/2 शीर्ष चौड़ाई x कोस (कोण)) - जो शीर्ष दाएं कोने बिंदु प्राप्त करता है।

पाप और कोण और चौड़ाई के रूप में उपयुक्त

एक परीक्षण के रूप में क्योंकि का उपयोग कर आयत के आसपास जारी रखें: चेक आप इसे प्रारंभिक बिंदु

5

वापस करने के लिए बनाया आप जानते हैं कि आपके चतुर्भुज एक आयत है, तो तो आप कोनों के निर्देशांक खोजने के लिए कुछ सरल वेक्टर गणित का उपयोग कर सकते हैं।knowns हैं:

  • (x1,y1) - शीर्ष की लंबाई और नीचे लाइनों
  • - लब्बोलुआब यह
  • l1 पर मध्य का समन्वय - शीर्ष पंक्ति
  • (x2,y2) पर मध्य का समन्वय
  • l2 - अन्य दो लाइनों की लंबाई

सबसे पहले, हम दो ज्ञात अंक के बीच वेक्टर पाते हैं। इस वेक्टर साइड लाइन के समानांतर है:

(vx, vy) = (x2 - x1, y2 - y1)

हम इस सदिश को सामान्य बनाने की जरूरत है (यानी यह लंबाई 1 बनाना) इसलिए हम इसे बाद में उपयोग कर सकते हैं एक आधार के रूप में हमारे निर्देशांक खोजने के लिए।

vlen = sqrt(vx*vx + vy*vy)

(v1x, v1y) = (vx/vlen, vy/vlen)

इसके बाद, हम 90 डिग्री से इस सदिश घड़ी की विपरीत बारी बारी से। घूर्णन वेक्टर शीर्ष और निचली रेखाओं के समानांतर होगा। 90 डिग्री रोटेशन केवल निर्देशांक को स्वैप करने और उनमें से एक को अस्वीकार करने के लिए बाहर निकलता है। आप पेपर पर इसे आज़माकर इसे देख सकते हैं। या equations for 2D rotations पर नज़र डालें और 90 डिग्री में विकल्प लें।

(u1x, u1y) = (-v1y, v1x)

अब हम 'ऊपरी-बाएं' कोने को खोजने के लिए पर्याप्त जानकारी नहीं है। हम केवल हमारे बिंदु (x1, y1) पर शुरू और आधे पक्ष लंबाई से वापस उस ओर के साथ चल:

(p1x, p1y) = (x1 - u1x * l1/2, y1 - u1y * l1/2)

यहाँ से हम शेष अंक प्राप्त कर सकते हैं बस हमारी आधार वैक्टर की उचित गुणकों जोड़कर। जब यह लागू करते समय आपको स्पष्ट रूप से यह केवल प्रत्येक अद्वितीय गुणा एक ही समय की गणना के द्वारा तेजी लाने के कर सकते हैं:

(p2x, p2y) = (p1x + u1x * l1, p1y + u1y * l1)

(p3x, p3y) = (p1x + v1x * l2, p1y + v1y * l2)

(p4x, p4y) = (p3x + u1x * l1, p3y + u1y * l1)

0
/* rcx = center x rectangle, rcy = center y rectangle, rw = width rectangle, rh = height rectangle, rr = rotation in radian from the rectangle (around it's center point) */ 

function toRectObjectFromCenter(rcx, rcy, rw, rh, rr){ 
    var a = { 
     x: rcx+(Math.sin((rr-degToRad(90))+Math.asin(rh/(Math.sqrt(rh*rh+rw*rw)))) * (Math.sqrt(rh*rh+rw*rw)/2)), 
     y: rcy-(Math.cos((rr-degToRad(90))+Math.asin(rh/(Math.sqrt(rh*rh+rw*rw)))) * (Math.sqrt(rh*rh+rw*rw)/2)) 
    }; 
    var b = { 
     x: a.x+Math.cos(rr)*rw, 
     y: a.y+Math.sin(rr)*rw 
    }; 
    var c = { 
     x: b.x+Math.cos(degToRad(radToDeg(rr)+90))*rh, 
     y: b.y+Math.sin(degToRad(radToDeg(rr)+90))*rh 
    }; 
    var d = { 
     x: a.x+Math.cos(degToRad(radToDeg(rr)+90))*rh, 
     y: a.y+Math.sin(degToRad(radToDeg(rr)+90))*rh 
    }; 
    return {a:a,b:b,c:c,d:d}; 
} 
2
function getFirstPoint(x1,y1,x2,y2,l1,l2) 
    distanceV = {x2 - x1, y2 - y1} 
    vlen = math.sqrt(distanceV[1]^2 + distanceV[2]^2) 
    normalized = {distanceV[1]/vlen, distanceV[2]/vlen} 
    rotated = {-normalized[2], normalized[1]} 
    p1 = {x1 - rotated[1] * l1/2, y1 - rotated[2] * l1/2} 
    p2 = {p1[1] + rotated[1] * l1, p1[2] + rotated[2] * l1} 
    p3 = {p1[1] + normalized[1] * l2, p1[2] + normalized[2] * l2} 
    p4 = {p3[1] + rotated[1] * l1, p3[2] + rotated[2] * l1} 
    points = { p1 , p2 , p3 , p4} 
    return p1 
end 
संबंधित मुद्दे