Date le posizioni e le velocità bidimensionali di una coppia di palle da biliardo subito prima dell'impatto, calcola le loro velocità dopo una collisione perfettamente elastica . Si presume che le sfere siano sfere ideali (o equivalentemente: cerchi) con lo stesso raggio, stessa massa, densità uniforme e nessun attrito.
L'ingresso è composto da 8 numeri: p0x,p0y,v0x,v0y,p1x,p1y,v1x,v1y
dov'è p0x,p0y
il centro della prima palla, la v0x,v0y
sua velocità e similmente p1x,p1y,v1x,v1y
per la seconda palla. È possibile accettare input in qualsiasi ordine e strutturati in qualsiasi modo conveniente, ad esempio come un array 2x2x2 o forse un array 2x2 per p
e due array di lunghezza 2 per v0
e v1
. Va anche bene prendere numeri complessi (se la tua lingua li supporta) invece di coppie xy. Tuttavia, non si dovrebbe prendere input in un sistema di coordinate diverso da cartesiano, cioè non è consentito il polar.
Nota che il raggio di una palla da biliardo è metà della distanza tra p0x,p0y
e p1x,p1y
, quindi non è dato come parte esplicita dell'input.
Scrivi un programma o una funzione che emetta o restituisca 4 numeri in qualsiasi rappresentazione cartesiana conveniente: i valori post-collisione di v0x,v0y,v1x,v1y
.
Un possibile algoritmo è:
trova la linea normale che attraversa entrambi i centri
trova la linea tangente che passa attraverso il punto medio tra i due centri ed è perpendicolare alla linea normale
cambiare il sistema di coordinate e scomporre
v0x,v0y
ev1x,v1y
nei loro componenti tangenziali e normaliv0t,v0n
ev1t,v1n
scambiare i componenti normali di
v0
ev1
, preservandone i componenti tangenzialitornare al sistema di coordinate originale
Test (risultati arrotondati al 5 ° decimale):
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]
Vittorie più brevi. Nessuna scappatoia.
grazie @Anush per l' aiuto nella correzione del colore di sfondo del diagramma
r=p-q
conp-=q
e utilizzi ulteriormentep
invece dir
, come nella risposta js di Neil