इसलिए मैं एक उछलती हुई गेंद का अनुकरण बना रहा हूं, और उपयोगकर्ता एक बिंदु से दूसरे बिंदु तक खींचकर कैनवास पर गेंद को टकराने वाली रेखाएं रख सकता है। अनिवार्य रूप से चार लाइनें बनाई जा सकती हैं:

Four line options, with their respective save points in an object.

तो एक लाइन को स्टोर करने वाली वस्तु को इस प्रकार परिभाषित किया गया है:

export interface pathSection {
    xfrom: number;
    yfrom: number;
    xto: number;
    yto: number;
    length: number;
}

उदाहरण के लिए छवि में पहली और तीसरी पंक्तियाँ समान मान नहीं देती हैं

Math.atan2(yto - yfrom, xto - from);

तो सतहों की (सापेक्ष) जटिलता को देखते हुए, मुझे एक चलती वस्तु और उस सतह के बीच के कोण को टक्कर के बिंदु पर खोजने की आवश्यकता है:

ballstrike

गेंद सतह पर एक कोण से टकराती है, जो मुझे चाहिए!

हालाँकि मुझे दो वैक्टरों के बीच के कोण को खोजने में परेशानी हो रही है। यह वही है जो मैंने समझा काम करेगा:

var dx = this.path[index_for_path_section].xfrom - this.path[index_for_path_section].xto;
var dy = this.path[index_for_path_section].yfrom - this.path[index_for_path_section].yto;
var posX = this.particle.pos.x;
var posY = this.particle.pos.y;
var posNextX = posX + this.particle.v.x;
var posNextY = posY + this.particle.v.y;

var angleOfRamp = Math.atan2(dy, dx);
var angleOfvelocity = Math.atan2(posNextY - posY, posNextX - posX);
var angleBetween =  angleOfRamp - angleOfvelocity;

इसके बाद टक्कर के बाद वस्तु की गति की गणना करने के लिए इसका उपयोग किया जाता है:

var spd = Math.sqrt(this.particle.v.x * this.particle.v.x + this.particle.v.y * this.particle.v.y);
var restitution = this.elasticity / 100;

this.particle.v.x = restitution * spd * Math.cos(angleBetween);
this.particle.v.y = restitution * spd * Math.sin(angleBetween);

हालाँकि गणना किया गया कोण -4.5 पाई के आसपास है, वस्तु के लिए लगभग -90 डिग्री सीधे नीचे और सतह जो लगभग 45-60 डिग्री दिखती है ...

demo picture

लाल तीर सतह के माध्यम से चलती वस्तु का मार्ग दिखाता है - सफेद बिंदु दिखाते हैं कि सतह और वस्तु के बीच टकराव का पता कहां चला है।

दो वेग और रेखा के बीच सही और प्रयोग करने योग्य कोण कैसे प्राप्त करें इस पर कोई मदद की सराहना की जाएगी!

नोट मैंने इस समाधान का उपयोग करने का प्रयास किया है, लेकिन इसके लिए संघर्ष किया है इसे मेरे अपने काम के अनुकूल बनाएं।

0
Alexander Bunting 3 नवम्बर 2020, 15:25

1 उत्तर

सबसे बढ़िया उत्तर

तो मुझे कुछ समय लगा, और मुझे अभी भी 100% यकीन नहीं है कि यह क्यों काम करता है क्योंकि मुझे लगता है कि मैं जावास्क्रिप्ट कोण प्रणाली को थोड़ा मुश्किल ढूंढ रहा हूं, लेकिन:

var dx = this.path[collided].xfrom - this.path[collided].xto;
var dy = this.path[collided].yfrom - this.path[collided].yto;
var spd = Math.sqrt(this.particle.v.x * this.particle.v.x + this.particle.v.y * this.particle.v.y);
                 
var angleOfRamp = Math.atan2(dy, dx);
var angleOfvelocity = Math.atan2(this.particle.v.y, this.particle.v.x);
var angleBetween =  angleOfRamp * 2 - angleOfvelocity; // not sure why :)

if (angleBetween < 0) { angleBetween += 2*Math.PI; } // not sure why :)
                 
const restitution = this.elasticity / 100;

this.particle.v.x = restitution * spd * Math.cos(angleBetween);
this.particle.v.y = restitution * spd * Math.sin(angleBetween);

देखने वाले सभी को धन्यवाद :)

0
Alexander Bunting 3 नवम्बर 2020, 16:01