দ্রষ্টব্য: নীচের সমস্ত অনুমান করে যে বলের পৃষ্ঠটি ঘর্ষণহীন (তাই এটি স্পিনিং শুরু করবে না বা আলাদা হওয়ার কারণে এটি পুনরায় প্রত্যাবর্তন করবে না)।
সংঘর্ষের মুহুর্তে, বলটি কোণে স্পর্শ করবে। যখন শক্ত বস্তুগুলির সংঘর্ষ হয়, তখন একটি শক্তি তথাকথিত পৃষ্ঠটিকে সাধারণভাবে অর্থাৎ সংঘর্ষের পর্যায়ে পৃষ্ঠের লম্ব করে নিয়ে কাজ করবে।
যেহেতু এটি একটি বল, তাই পৃষ্ঠের লম্বটি বলের কেন্দ্রের দিকে। ঠিক আছে, সুতরাং আমরা বাহিনীর দিকটি জানি, এর প্রস্থতা কী? একটি স্থিতিস্থাপক সংঘর্ষ (এবং আয়তক্ষেত্রটি চলতে পারে না) ধরে নিয়ে বলটি একই গতিবেগের সাথে প্রভাব ফেলতে হবে 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;