Biorąc pod uwagę dwuwymiarowe położenia i prędkości pary kulek bilardowych tuż przed uderzeniem, oblicz ich prędkości po idealnie elastycznym zderzeniu . Przyjmuje się, że kule są idealnymi kulami (lub równoważnie: okręgami) o tym samym promieniu, tej samej masie, jednolitej gęstości i bez tarcia.
Dane wejściowe składają się z 8 liczb: p0x,p0y,v0x,v0y,p1x,p1y,v1x,v1ygdzie p0x,p0yjest środek pierwszej kuli, v0x,v0yjej prędkość i podobnie p1x,p1y,v1x,v1ydla drugiej kuli. Możesz zaakceptować dane wejściowe w dowolnej kolejności i uporządkowane w dowolny dogodny sposób, np. Jako tablica 2x2x2, a może tablica 2x2 dla pi dwie tablice o długości 2 dla v0i v1. Dobrze jest również przyjmować liczby zespolone (jeśli twój język je obsługuje) zamiast par xy. Nie należy jednak wprowadzać danych w układzie współrzędnych innym niż kartezjański, tzn. Biegunowe jest niedozwolone.
Zauważ, że promień piłki bilardowej wynosi połowę odległości między p0x,p0yi p1x,p1y, więc nie jest podany jako wyraźna część danych wejściowych.
Napisz program lub funkcję, która generuje lub zwraca 4 liczby w dowolnej wygodnej reprezentacji kartezjańskiej: wartości po zderzeniu z v0x,v0y,v1x,v1y.
Możliwym algorytmem jest:
znajdź normalną linię, która przechodzi przez oba centra
znajdź linię styczną , która przechodzi przez punkt środkowy między dwoma środkami i jest prostopadła do linii normalnej
zmieniają się w układzie współrzędnych i rozbić
v0x,v0yiv1x,v1ydo ich stycznych i normalnych składnikówv0t,v0niv1t,v1nzamień normalne komponenty
v0iv1, zachowując ich styczne komponentywróć do pierwotnego układu współrzędnych
Testy (wyniki zaokrąglone do 5 miejsc po przecinku):
p0x p0y v0x v0y p1x p1y v1x v1y -> v0x' v0y' v1x' v1y'
[-34.5,-81.8, 34.7,-76.1, 96.2,-25.2, 59.2,-93.3] [ 49.05873, -69.88191, 44.84127, -99.51809]
[ 36.9, 77.7,-13.6,-80.8, -7.4, 34.4, 15.1,-71.8] [ 5.57641, -62.05647, -4.07641, -90.54353]
[-51.0, 17.6, 46.1,-80.1, 68.6, 54.0,-35.1,-73.9] [ -26.48927,-102.19239, 37.48927, -51.80761]
[-21.1,-52.6,-77.7, 91.5, 46.0, 94.1, 83.8, 93.7] [ -48.92598, 154.40834, 55.02598, 30.79166]
[ 91.3, -5.3, 72.6, 89.0, 97.8, 50.5, 36.2, 85.7] [ 71.73343, 81.56080, 37.06657, 93.13920]
[-79.9, 54.9, 92.5,-40.7,-20.8,-46.9,-16.4, -0.9] [ 47.76727, 36.35232, 28.33273, -77.95232]
[ 29.1, 80.7, 76.9,-85.1,-29.3,-49.5,-29.0,-13.0] [ 86.08581, -64.62067, -38.18581, -33.47933]
[ 97.7,-89.0, 72.5, 12.4, 77.8,-88.2, 31.5,-34.0] [ 33.42847, 13.97071, 70.57153, -35.57071]
[-22.2, 22.6,-61.3, 87.1, 67.0, 57.6,-15.3,-23.1] [ -58.90816, 88.03850, -17.69184, -24.03850]
[-95.4, 15.0, 5.3, 39.5,-54.7,-28.5, -0.7, 0.8] [ 21.80656, 21.85786, -17.20656, 18.44214]
[ 84.0,-26.8,-98.6,-85.6,-90.1, 30.9,-48.1, 37.2] [ -89.76828, -88.52700, -56.93172, 40.12700]
[ 57.8, 90.4, 53.2,-74.1, 76.4,-94.4,-68.1,-69.3] [ 51.50525, -57.26181, -66.40525, -86.13819]
[ 92.9, 69.8,-31.3, 72.6,-49.1,-78.8,-62.3,-81.6] [-123.11680, -23.48435, 29.51680, 14.48435]
[-10.3,-84.5,-93.5,-95.6, 35.0, 22.6, 44.8, 75.5] [ -11.12485, 99.15449, -37.57515,-119.25449]
[ -3.9, 55.8,-83.3, 9.1, -2.7,-95.6, 37.7,-47.8] [ -82.84144, -48.75541, 37.24144, 10.05541]
[-76.5,-88.4,-76.7,-49.9, 84.5, 38.0, 4.2, 18.4] [ 6.52461, 15.43907, -79.02461, -46.93907]
[ 64.2,-19.3, 67.2, 45.4,-27.1,-28.7, 64.7, -4.3] [ 59.66292, 44.62400, 72.23708, -3.52400]
[ 9.8, 70.7,-66.2, 63.0,-58.7, 59.5, 83.7,-10.6] [ 68.07646, 84.95469, -50.57646, -32.55469]
[ 62.9, 46.4, 85.0, 87.4, 36.3,-29.0,-63.0,-56.3] [ 23.53487, -86.82822, -1.53487, 117.92822]
[ -5.5, 35.6, 17.6,-54.3, -2.2, 66.8,-15.2, 11.8] [ 24.15112, 7.63786, -21.75112, -50.13786]
Najkrótsze wygrane. Bez luk.
dzięki @Anush za pomoc w naprawie koloru tła diagramu

r=p-qsięp-=qi dalsze wykorzystaniepzamiastr, jak w odpowiedzi Neila js