c# - Calculating the Point3Ds of a Cuboid around a Line -


दो बिंदु 3 डी ( और बी ) हैं और मैं चाहता हूं A और बी के बीच की रेखा को एक पतवार की तरह घूमने वाले क्यूबायड (ए, बी, सी ... एच) के अंक की गणना करने के लिए:

छवि विवरण यहां दर्ज करें

एक डिग्री स्वतंत्रता है, क्यूबाइड का कोण, क्योंकि यह लाइन AB के चारों ओर घूम सकता है मुझे यकीन है कि अभी तक यह कोई समस्या नहीं है।

मैंने एबी , डी , और फिर क्रॉस उत्पाद के लिए सामान्य एक वेक्टर की गणना करने की कोशिश की एबी & # x2a2f; विज्ञापन = सी सी - बी है, इसलिए यह AB के ऑफसेट समांतर है।

P> मैंने इन तीन वैक्टर ( C , डी और ) को सामान्यीकृत किया और इसे ऑफसेट के साथ और बी यह अभी तक काफी काम नहीं कर रहा है

संपादित करें: समाधान के लिए ja72 का कोड देखें

मैंने भी एक सामान्य वेक्टर खोजने का एक तरीका कार्यान्वित किया:

  डबल Ax = Vector3D.AngleBetween (ई, नया वेक्टर 3 डी (1, 0, 0)); डबल एआई = वेक्टर 3 डी। एन्जेलबीटीन (ई, नया वेक्टर 3 डी (0, 1, 0)); डबल az = Vector3D.AngleBetween (ई, नया वेक्टर 3 डी (0, 0, 1)); कुल्हाड़ी = मठ। एब्स (कुल्हाड़ी - 9 0); एआई = मठ। एब्स (एई -90); Az = Math.Abs ​​(az - 90); अगर (कुल्हाड़ी और एलटी; = एआई एंड एआईएफ & एलटी; = एज) {एन = वेक्टर 3 डी। क्रॉसप्रोडक्ट (ई, नया वेक्टर 3 डी (1, 0, 0)); } और अगर (az & lt; = ax & amp; az & lt; = ay) {n = वेक्टर 3 डी। क्रॉसप्रोडक्ट (ई, नया वेक्टर 3 डी (0, 0, 1)); } और {n = वेक्टर 3 डी। क्रॉसप्रुडक्ट (ई, नया वेक्टर 3 डी (0, 1, 0)); } N = सामान्य (एन);  

आपको दो दिशाएं वैक्टर की आवश्यकता है एक एबी

<पूर्व> वेक्टर 3 डी ई = सामान्यीकृत (बीए)

द्वारा दिया गया है और "अप करने के लिए" "पार अनुभाग के लिए दिशा यह दिया जा सकता है, या इसे निम्नलिखित एल्गोरिथ्म (+ y की ओर वरीयता के साथ)

  से गणना की जा सकती है, यदि (एक्स! = 0 || ईजेड! = 0) {// निर्देश दिशा सीधा + Y दिशा के सबसे निकटतम रेखा वेक्टर 3 डी एन = [-एक्स * ईवाई, एक्स * ई.एक्स + ईजेड * ईजेड, -ईजेड * ईई]; } Else {// अगर लाइन के साथ + y पहले से ही चुन लेते हैं तो Z के लिए वेक्टर वेक्टर 3 डी एन = [0, 0, 1]; }  

अब आप एक समन्वय प्रणाली बनाने के लिए तीसरी दिशा की गणना कर सकते हैं

  Vector3D k = सामान्य (क्रॉस (ई, एन))  

और आप 3 × 3 रोटेशन मैट्रिक्स को इकट्ठा करते हैं जो स्थानीय निर्देशांक को विश्व के साथ समन्वयित करता है

  | के.एक्स एनएक्स ई.एक्स | आर = | के.वाई. एन.ई. ई.आई. | | के.जे.एन.जेड ई.एड. |  

स्थानीय निर्देशांक के पास लाइन के साथ + z के रूप में दिशा है, जो कि

  पॉइंट 3 डी ए = ए + आर * [w, h, 0] पॉइंट 3 डी B = A + R * [- w, h, 0] बिंदु 3 डी सी = ए + आर * [w, -h, 0] बिंदु 3 डी डी = ए + आर * [- w, -h, 0] पॉइंट 3 डी ई = बी + R * [w, h, 0] Point3D f = B + R * [- w, h, 0] Point3D g = B + R * [w, -h, 0] पॉइंट 3 डी एच = बी + आर * [- w, -एच, 0]  

जहां R * [x, y, z] एक मैट्रिक्स-वेक्टर गुणन, w और < कोड> एच आयताकार क्रॉस सेक्शन की चौड़ाई और ऊंचाई है, और , बी बिंदु हैं और बी स्थिति वैक्टर वैक्टर के बीच यहां जोड़ तत्व है तत्व द्वारा।


मैंने अपने कोड में कोड की जांच की है और यह काम करता है। vec3 एक 3 डी वेक्टर के लिए उपनाम है, मैट 3 3 × 3 मैट्रिक्स के लिए उपनाम है।

  vec3 u = (बीए)। सामान्यीकृत (); Vec3 n = vec3.O; अगर (मठ। एब्स (यूएक्स) & lt; = मठ। एब्स (यूवाय) और मठ। एब्स (यूएक्स) & lt; = मठ। एब्स (यूज़)) {एन = नया वीसी 3 (यूआई * यू। वाई + यूज़ * यूजेड, -यूए * यूएक्स, -यूएड * यूएक्स); } और अगर (मठ। एब्स (यूआई)) और = मठ। एब्स (यूएक्स) और मठ। एब्स (यूवाय) & lt; = मठ। एब्स (यूज़)) {एन = नया वीसी 3 (-यूएक्स * यूआई, UX * u.X + uZ * uZ, -UZ * uY); } और अगर (मठ। एबस (यूजेड) और lt; = मठ। एब्स (यूएक्स) और मठ। एब्स (यूज़) & lt; = मठ.एबीएस (यूआई)) {एन = नया वीसी 3 (-यूएक्स * यूजेड, -यूए * यूजेड, यूएक्स * यू.एक्स + यूआई * यूआई); } Vec3 v = n.Cross (u); मैट 3 आर = मैट 3। कोबाइन (वी, एन, यू); Var a = A + R * नया vec3 (wt, ht, 0); Var बी = ए + आर * नया vec3 (-wt, एचटी, 0); Var c = A + R * नया vec3 (wt, -ht, 0); Var d = A + R * नया vec3 (-wt, -ht, 0); Var ई = बी + आर * नया वीसी 3 (वाइटी, एचटी, 0); Var f = B + R * नया vec3 (-wt, ht, 0); Var g = B + R * नया vec3 (wt, -ht, 0); Var h = B + R * नया vec3 (-wt, -ht, 0);  

Comments