Aquí hay algo de código C#:
using System;
using System.Windows;
class Mapper
{
public static Point MapPoint(Point a1, Point a2, Point b1, Point b2, Point p)
{
Vector u = a2 - a1; // Vector along source line a1-a2
Vector v = b2 - b1; // Vector along destination line b1-b2
Point am = a1 + 0.5*u; // Mid-point of line a1-a2
Point bm = b1 + 0.5*v; // Mid-point of line b1-b2
double factor = 1 / (u.Length * v.Length);
double cosA = (u*v) * factor;
double sinA = Vector.CrossProduct(u,v) * factor;
double x = (p - am).X * cosA - (p - am).Y * sinA + bm.X;
double y = (p - am).X * sinA + (p - am).Y * cosA + bm.Y;
return new Point(x,y);
}
static void Main(string[] args)
{
Point a1 = new Point(2,1); Point a2 = new Point(8,5); Point am = new Point(5,3);
Point b1 = new Point(1,3); Point b2 = new Point(5,9); Point bm = new Point(3,6);
Point p, q;
p = a1;
q = MapPoint(a1, a2, b1, b2, p);
Console.WriteLine("a1 maps to: " + q.ToString()); // q should = b1
p = a2;
q = MapPoint(a1, a2, b1, b2, p);
Console.WriteLine("a2 maps to: " + q.ToString()); // q should = b2
p = am;
q = MapPoint(a1, a2, b1, b2, p);
Console.WriteLine("am maps to: " + q.ToString()); // q should = bm
Console.ReadLine();
}
}
Utiliza las estructuras Point y Vector de System.Windows (en el ensamblaje WindowsBase).
La parte importante es la función MapPoint. Asigna un punto de entrada $p$ a un punto de salida que es devuelto por la función. El mapeo está definido por cuatro puntos $a_1$ , $a_2$ , $b_1$ y $b_2$ . La idea es que la "fuente" señale $a_1$ y $a_2$ se asignan (aproximadamente) a los puntos de destino $b_1$ y $b_2$ respectivamente. Este mapeo sólo será exacto si las distancias $a_1a_2$ y $b_1b_2$ son iguales. En realidad, lo que ocurre es que el punto medio de $a_1a_2$ se asigna al punto medio de $b_1b_2$ .
El código de prueba en la función Main muestra que las cosas funcionan correctamente. El punto medio $a_m$ se asigna a $b_m$ como era de esperar. Además, en este caso, $a_1$ se asigna a $b_1$ y $a_2$ se asigna a $b_2$ ya que las distancias $a_1a_2$ y $b_1b_2$ son iguales.