Berechnen Sie anhand der zweidimensionalen Positionen und Geschwindigkeiten eines Billardkugelpaares unmittelbar vor dem Aufprall die Geschwindigkeiten nach einer perfekt elastischen Kollision . Es wird angenommen, dass die Kugeln ideale Kugeln (oder gleichwertige Kreise) mit dem gleichen Radius, der gleichen Masse, der gleichen Dichte und ohne Reibung sind.
Die Eingabe besteht aus 8 Zahlen: p0x,p0y,v0x,v0y,p1x,p1y,v1x,v1yWo p0x,p0yist der Mittelpunkt des ersten Balls, v0x,v0yseine Geschwindigkeit und in ähnlicher Weise p1x,p1y,v1x,v1yfür den zweiten Ball. Sie können Eingaben in beliebiger Reihenfolge und in beliebiger Weise strukturieren, z. B. als 2x2x2-Array oder als 2x2-Array für pund als zwei Arrays der Länge 2 für v0und v1. Es ist auch in Ordnung, komplexe Zahlen (sofern Ihre Sprache diese unterstützt) anstelle von xy-Paaren zu verwenden. Sie sollten jedoch keine Eingabe in einem anderen Koordinatensystem als kartesisch vornehmen, dh polar ist nicht zulässig.
Beachten Sie, dass der Radius einer Billardkugel die Hälfte des Abstands zwischen p0x,p0yund beträgt und p1x,p1ydaher nicht als expliziter Teil der Eingabe angegeben wird.
Schreiben Sie ein Programm oder eine Funktion, die 4 Zahlen in einer beliebigen geeigneten kartesischen Darstellung ausgibt oder zurückgibt: die Post-Collision-Werte von v0x,v0y,v1x,v1y.
Ein möglicher Algorithmus ist:
Finden Sie die normale Linie, die durch beide Zentren verläuft
Finden Sie die Tangente , die durch den Mittelpunkt zwischen den beiden Zentren verläuft und senkrecht zur Normalen verläuft
ändern Koordinatensystem und bricht
v0x,v0yundv1x,v1yin ihre tangentialen und normalen Komponentenv0t,v0nundv1t,v1nVertauschen Sie die normalen Komponenten von
v0undv1, wobei die tangentialen Komponenten erhalten bleibenWechseln Sie zurück zum ursprünglichen Koordinatensystem
Tests (Ergebnisse auf 5 Dezimalstellen gerundet):
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]
Kürzeste Siege. Keine Lücken.
Vielen Dank an @Anush, dass Sie dabei helfen, die Hintergrundfarbe des Diagramms zu korrigieren

r=p-qmitp-=qund die weitere Verwendungpstattr, wie in Neils js Antwort