একটি বল কোণে আঘাত করে, এটি কোথায় প্রতিফলিত হবে?


46

আমার ত্রিকোণমিতিটি ব্রাশ করা দরকার এবং আশা করি আপনি এখানে একটি সাধারণ গাণিতিক মডেলটি সাহায্য করতে পারেন। সংযুক্ত চিত্রটিতে এখন পর্যন্ত আমার মডেলটি এখানে রয়েছে। আমি সচেতন যে বলটি খুব দ্রুত গতিতে চলার সময় ফ্রেম অ্যানিমেশনটিতে অন্যান্য সমস্যা রয়েছে, তবে আপাতত আমার কেবল বলডেক্স এবং বলডি গণনা করা দরকার। এটিও সম্ভব যে বলডেক্স = 0 (কেবল উল্লম্ব চলাচল) তবে বল বল ডিএলকে ডিফল্ট করলে আলাদা মান পেতে পারে।

শক্ত অস্থাবর বস্তুর কোণ এবং প্রান্তের মধ্যে 2 ডি সংঘর্ষ


22
এটাকেই কি তারা "কর্নার কেস" বলে?
অ্যান্ড্রু গ্রিম

2
স্পষ্টতই, জিনিসগুলি যেমন চলছে, শীঘ্রই আমরা এটি সমাধানের জন্য আপেক্ষিক তত্ত্বটি কাজে লাগাতে পারি - সমস্যাটি ব্যাপক আকার ধারণ করছে (ive)।
লুমিস

উত্তর:


45

দ্রষ্টব্য: নীচের সমস্ত অনুমান করে যে বলের পৃষ্ঠটি ঘর্ষণহীন (তাই এটি স্পিনিং শুরু করবে না বা আলাদা হওয়ার কারণে এটি পুনরায় প্রত্যাবর্তন করবে না)।

সংঘর্ষের মুহুর্তে, বলটি কোণে স্পর্শ করবে। যখন শক্ত বস্তুগুলির সংঘর্ষ হয়, তখন একটি শক্তি তথাকথিত পৃষ্ঠটিকে সাধারণভাবে অর্থাৎ সংঘর্ষের পর্যায়ে পৃষ্ঠের লম্ব করে নিয়ে কাজ করবে।

যেহেতু এটি একটি বল, তাই পৃষ্ঠের লম্বটি বলের কেন্দ্রের দিকে। ঠিক আছে, সুতরাং আমরা বাহিনীর দিকটি জানি, এর প্রস্থতা কী? একটি স্থিতিস্থাপক সংঘর্ষ (এবং আয়তক্ষেত্রটি চলতে পারে না) ধরে নিয়ে বলটি একই গতিবেগের সাথে প্রভাব ফেলতে হবে reb

(এনডিএক্স, এনডি) সংঘর্ষের পরে বেগ হওয়া উচিত, (ওডিএক্স, ওডি) সংঘর্ষের আগে বেগ এবং (x, y) সংঘর্ষের স্থানে বলের অবস্থান হতে পারে। আসুন আরও ধরে নেওয়া যাক যে কোণটি বলটির সাথে সংঘর্ষে রয়েছে (0,0) এ।

সূত্র হিসাবে আমাদের অন্তর্দৃষ্টি প্রকাশ, আমাদের আছে:

(nDx, nDy) = (oDx, oDy) + c * (x, y)
length (nDx, nDy) = length (oDx, oDy)

যা সমান:

nDx = oDx + c * x
nDy = oDy + c * y
nDx^2 + nDy^2 = oDx^2 + oDy^2

শেষেরটিতে প্রথম দুটি সমীকরণ প্রতিস্থাপন করে আমরা পাই:

(oDx + c * x)^2 + (oDy + c * y)^2 = oDx^2 + oDy^2

দ্বিপদী থোরম ব্যবহার করে প্রসারিত করা হচ্ছে

(a+b)^2 = a^2 + 2ab + b^2 

উৎপাদনের:

oDx^2 + 2 * oDx * c * x + (c * x) ^ 2 + oDy^2 + 2 * oDy * c * y + (c * y) ^ 2 = oDx^2 + oDy^2
2 * oDx * c * x + 2 * oDy * c * y + (c * x) ^ 2 + (c * y) ^ 2 = 0
(2 * oDx * x + 2 * oDy * y) * c + (x^2 + y^2) * c^2 = 0

এই চতুষ্কোণ সমীকরণের cদুটি সমাধান রয়েছে যার একটি হল 0 স্পষ্টতই, এটি সমাধান নয় যা আমরা আগ্রহী, কারণ সাধারণত সংঘর্ষের ফলে বলের দিক পরিবর্তন হবে change অন্য সমাধানটি পেতে, আমরা উভয় পক্ষকে সি দ্বারা ভাগ করে নেব:

(2 * oDx * x + 2 * oDy * y) + (x^2 + y^2) * c = 0

এটাই:

 c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)

সংক্ষিপ্তসার হিসাবে, আমাদের আছে:

c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)
nDx = oDx + c * x
nDy = oDy + c * y

সম্পাদনা করুন : কোডে:

if (collision) {
    float x = ballX - cornerX;
    float y = ballY - cornerY;
    float c = -2 * (ballDx * x + ballDy * y) / (x * x + y * y);
    ballDx = ballDx + c * x;
    ballDy = ballDy + c * y;
}

কয়েকটি বাস্তবায়ন বিবেচনা: আপনি যখন সিমুলেশন পদক্ষেপের পরে বলের অবস্থানের সাথে আনুমানিক (x, y) করতে পারেন তবে এই অনুমাননটি বিচ্যুতির কোণকে পরিবর্তন করবে এবং তাই খুব লক্ষণীয় হতে পারে, তাই আপনার সিমুলেশন পদক্ষেপগুলি খুব সূক্ষ্ম হওয়া দরকার (সম্ভবত এমন বলটি প্রতি ধাপে তার ডায়ামটারের 1/20 এর বেশি স্থানান্তরিত করে না)। আরও সঠিক সমাধানের জন্য, আপনি সংঘর্ষের সময়টি গণনা করতে পারেন এবং সেই সময় সিমুলেশন পদক্ষেপটি বিভক্ত করতে পারেন, অর্থাৎ সংঘর্ষের বিন্দু পর্যন্ত একটি আংশিক পদক্ষেপ এবং পদক্ষেপের অবশিষ্ট অংশের জন্য আরেকটি আংশিক পদক্ষেপ করুন।

সম্পাদনা 2: প্রভাব বিন্দু গণনা

সিমুলেশন পদক্ষেপের শুরুতে r এর ব্যাসার্ধ, (x0, y0) অবস্থান এবং (dx, dy) বলের বেগ হতে দিন। সরলতার জন্য, আসুন আমরা ধরে নিই যে প্রশ্নের কোণারটি (0,0) এ অবস্থিত।

আমরা জানি:

(x,y) = (x0, y0) + (dx, dy) * t

আমরা চাই

length(x,y) = r

এটাই

(x0 + dx * t) ^ 2 + (y0 + dy * t) ^ 2 = r^2
x0^2 + 2 * x0 * dx * t + dx^2 * t^2 + y0^2 + 2 * y0 * dy * t + dy^2 * t^2 = r ^ 2
(dx^2 + dy^2) * t^2 + (2 * x0 * dx + 2 * y0 * dy) * t + (x0^2 + y0^2 - r^2) = 0
\____  _____/         \____________  ___________/       \_______  ________/
     \/                            \/                           \/
     a                             b                            c

এটি টি তে চতুর্ভুজ সমীকরণ । যদি এর বৈষম্যমূলক হয়

D = b^2 - 4 * a * c

নেতিবাচক, এর কোনও সমাধান নেই, অর্থাত্ বলটি তার বর্তমান কোর্সে কখনই আঘাত করবে না। অন্যথায়, এর দুটি সমাধান দ্বারা দেওয়া হয়

t1 = (-b - sqrt(D)) / (2 * a)
t2 = (-b + sqrt(D)) / (2 * a)

আমরা সময় সংঘর্ষের শুরু, যা আগে সময় আগ্রহী t1

আপনার পদ্ধতিটি হয়ে উঠবে:

    // compute a,b,c and D as given above

    if (D >= 0) {
        t = (-b - sqrt(D)) / (2 * a);
        if (0 < t && t <= ts) {
            // collision during this timestep!

            x = x + t * dx;
            y = y + t * dy;
            ts = ts - t;

            // change dx and dy using the deflection formula 
        }
    }

    x = x + ts * dx;
    y = y + ts * dy;

1
এটি +1
গতিশীল

1
Upvote

3
আপনি খুব তাড়াতাড়ি বলেছিলেন At the moment of collision, the ball will be touching the cornerতবে আমি এই সান্নিধ্যের কোন ন্যায়সঙ্গততা দেখতে পাচ্ছি না (এবং এটি অবশ্যই আনুমানিক হওয়া উচিত কারণ এটি সত্য নয় - বল দুটি জায়গায় স্পর্শ করছে , যার কোনটিই কোণার নয়)।
পিটার টেলর

1
@ পিটার টেইলর: আপনি লক্ষ্য করেছেন যে ওপিটি আয়তক্ষেত্রের বাইরে বলটি আঁকেছে , এবং প্রশ্নের মধ্যে দেওয়া সংঘর্ষ সনাক্তকরণের সূত্রটি এটিও ধরে নিয়েছে? আপনি এখানে বাক্সের বাইরে ভাবতে হবে :-)
মেরিটন -

1
এই উত্তরটি পছন্দ করুন তবে এটি গণিতের কিছু \ \ ল্যাটেক্স $ মার্কআপ ব্যবহার করতে পারে।
মার্টিন উইকম্যান

13

এখানে একটি সমস্যা দেখার জন্য একটি দর্শনীয় উপায় way

মূল সমস্যা সেটটি বৃত্ত বনাম আয়তক্ষেত্র (নীচের চিত্রে ধূসর)। এটি বিন্দু বনাম বৃত্তাকার রেক্টরের সমান (কালোতে দেখানো)।

সুতরাং এটি একটি বহু অংশের সমস্যা। আপনি আপনার পয়েন্টের সংঘর্ষের বনাম ৪ টি লাইন পরীক্ষা করছেন (মূল বৃত্তের ব্যাসার্ধ দ্বারা বক্সের প্রান্ত থেকে বেরিয়েছেন) এবং ৪ টি বৃত্ত (মূল বৃত্তের একই ব্যাসার্ধের সাথে আয়তক্ষেত্রের কোণে)।

আপনার মূল চিত্রটিতে মোটামুটি গতিবেগের সাথে পয়েন্টটি নীচের ডানদিকে কোণায় চাপবে। আপনাকে যা করতে হবে তা হল কোণার বৃত্তের যে বিন্দুটি আঘাত হানবে, তার কোণটি গণনা করুন এবং এটিকে প্রতিফলিত করবেন figure

এখানে চিত্র বর্ণনা লিখুন

আমি পাঠকের কাছে অনুশীলন হিসাবে এর ব্যয়টি ছেড়ে দেব।


2

আমি একটি গেম নিয়ে কাজ করছি এবং এখানেও আটকেছি। তবে আমার ধারণা এটি এইভাবে চলে:

এখানে চিত্র বর্ণনা লিখুন

আরেকটি মতামত রয়েছে আমার সমস্যাটি হ'ল আমি কীভাবে দ্রুত নতুন ডিএক্স, ডিইএল গণনা করতে জানি না (আমার কাছে প্রচলিত গণিতটি খুব বেশি গণনার প্রয়োজন)।


আমার দৃষ্টিভঙ্গি ২ য় লিঙ্কের সাথে পৃথক, কারণ আমি মনে করি না যে নতুন বেগের ভেক্টর ব্লকের কেন্দ্রের মতো নির্ভর করে। আমার ভাই আমাকে বলেছিলেন যে বলটি আবার পুরানো দিকে ফিরে যাবে (dx = -dx &&y dy = - dy) তবে আমি তা মনে করি না।
রিসা

যদি বলটি কোণে আঘাত করে এবং কর্নার এক্স থেকে বলএক্সের দূরত্ব বল ডাব্লু এর 1/4 এর চেয়ে কম হয় তবে এটি পিছনে ফিরে আসবে, অন্যথায় এটি ডানদিকে অগ্রসর হবে। আমি এই মুহুর্তে এটি ব্যবহার করছি এমন একটি সাধারণ মডেল, যা সঠিক কোণটি খুঁজে পাওয়ার জন্য সুরক্ষিত নয়।
লুমিস

0

গতিবিজ্ঞান হ'ল রেফারেন্সের ফ্রেমের গণনার পক্ষে সবচেয়ে সুবিধাজনক হিসাবে সঠিকটি বেছে নেওয়া ।

এখানে আমরা প্রথমে রূপান্তর টি সংজ্ঞায়িত করব যা আমাদের অক্ষকে উপাদান সমান্তরাল ( x ' ) এবং লম্ব ( y )) এবং বলের কেন্দ্র এবং কোণার মধ্যবর্তী একটি লাইনে সমাধান করে। বিপরীত রূপান্তর টি * আমাদের মূল স্থানাঙ্ক ব্যবস্থা পুনরুদ্ধার করবে।

রেফারেন্স এই নতুন ফ্রেমে, প্রতিফলন (এবং সময় এবং পদার্থবিজ্ঞানের স্থান প্রতিসাম্য) দ্বারা, আমরা যোগাযোগ বেগ রূপান্তর আছে এম (ক বিন্দু প্রৈতি ) যা reverses যে এক্স ' উপাদান এবং পাতা অপরিবর্তিত Y' অংশটি। ইন ম্যাট্রিক্স পদ এই তির্যক সঙ্গে তির্যক ম্যাট্রিক্স -1 এবং 1।

সংঘর্ষের পরে গতিবেগটি সহজভাবে: ভি ' = টি *এমটিভো

এফেক্ট টি- এর সময়টি কেবলমাত্র ( টিডু ) + ( এক্সটিভো ) ( টি ) = আর এর জন্য যেখানে এক্স এক্স-অক্ষ প্রজেকশন অপারেটর এবং আর বলের ব্যাসার্ধ হয় r পুনরায় সাজানো, আমরা
টি = ( আর - ( টিডু )) / (( এক্সটিভো ) ( টি )) পাই

সমস্ত জটিল গণিতকে কঠোরভাবে লিখিত, পরীক্ষিত, এবং ডিবাগ স্ট্যান্ডার্ড গ্রাফিক্স লাইব্রেরিতে সমাহিত করার স্বতন্ত্র সুবিধা রয়েছে। এই সমাধানটি 2 ডি এবং 3 ডি পরিস্থিতিতেও অভিন্ন - কেবল গ্রাফিক্স লাইব্রেরি স্যুইচ করুন। পরিশেষে, এটি হাইলাইট করে যে কোনও পদার্থবিজ্ঞানের সমস্যা মোকাবেলার আগে প্রথমে যথাযথ ফ্রেমগুলির বিষয়ে চিন্তা করা উচিত । সেখানে সবসময় এনআইএইচ প্রলোভন থাকে তবে সত্য যে এটি যখন বাগের জন্য আরও সমাধানের জন্য সমাধান পাওয়া যায় কেবল তখনই একটি রেসিপি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.