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,v1y
Wo p0x,p0y
ist der Mittelpunkt des ersten Balls, v0x,v0y
seine Geschwindigkeit und in ähnlicher Weise p1x,p1y,v1x,v1y
fü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 p
und als zwei Arrays der Länge 2 für v0
und 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,p0y
und beträgt und p1x,p1y
daher 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,v0y
undv1x,v1y
in ihre tangentialen und normalen Komponentenv0t,v0n
undv1t,v1n
Vertauschen Sie die normalen Komponenten von
v0
undv1
, 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-q
mitp-=q
und die weitere Verwendungp
stattr
, wie in Neils js Antwort