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 a1 , a2 , b1 y b2 . La idea es que la "fuente" señale a1 y a2 se asignan (aproximadamente) a los puntos de destino b1 y b2 respectivamente. Este mapeo sólo será exacto si las distancias a1a2 y b1b2 son iguales. En realidad, lo que ocurre es que el punto medio de a1a2 se asigna al punto medio de b1b2 .
El código de prueba en la función Main muestra que las cosas funcionan correctamente. El punto medio am se asigna a bm como era de esperar. Además, en este caso, a1 se asigna a b1 y a2 se asigna a b2 ya que las distancias a1a2 y b1b2 son iguales.