Orso Bruno ha scritto:
Boh
Tanto lo so che lo sai e fai solo lo spiritoso
Comunque un ripassino di geometria fa sempre bene.
La posizione di un corpo nel piano è data da due coordinate x, y e possiamo usare una classe Point per indicarla, la velocità di un corpo nel piano è data da un vettore che ha due componenti vx e vy e usiamo una classe Vector per indicarla.
Mi raccomando fate i bravi e non usate la stessa classe per indicare posizione e velocità, pur essendo entrambe una coppia di numeri, sono due cose diverse!
Quando devi proiettare una velocità lungo una certa direzione (ad esempio la velocità della sfera lungo la retta che congiunge i centri) si usa il prodotto scalare (da non confondere con il prodotto per uno scalare), il risultato è la componente della velocità lungo quella retta.
Dato che un esempio vale più di mille parole scrivo due classi Point e Vector che hanno tutti i metodi necessari per risolvere il probleme dei rimbalzi.
public class Point
{
public double X { get; set; }
public double Y { get; set; }
public Point(double x, double y)
{
X = x;
Y = y;
}
public double Distance(Point p)
{
double a = X - p.X;
double b = Y - p.Y;
return Math.Sqrt(a * a + b * b);
}
}
public class Vector
{
public double X { get; set; }
public double Y { get; set; }
public Vector(double x, double y)
{
X = x;
Y = y;
}
public Vector(Point p1, Point p2)
{
X = p2.X - p1.X;
Y = p2.Y - p1.Y;
}
public static Vector Add(Vector a, Vector b)
{
return new Vector(a.X + b.X, a.Y + b.Y);
}
public double DotProduct(Vector v) // Prodotto scalare
{
return X * v.X + Y * v.Y;
}
public double Magnitude // Norma o lunghezza del vettore
{
get { return Math.Sqrt(X * X + Y * Y); }
}
public Vector Multiply(double d) // moltiplicazione per uno scalare
{
return new Vector(X * d, Y * d);
}
public Vector Normalize
{
get { return Multiply(1 / Magnitude); }
}
public Vector Ortogonal
{
get { return new Vector(-Y, X); }
}
public Vector Project(Vector v)
{
Vector vn = v.Normalize;
return vn.Multiply(DotProduct(vn));
}
}
Naturalmente nel NetFramework esistono già delle classi simili.