По сути, то, что я пытаюсь сделать, - это перемещение точки относительно двух разных шкал.
Причина в том, чтобы редактировать значения в базе данных 3D -приложения. Пересерите красную точку, относительно красной шкалы в синий шкалу и в конечном итоге с синей точкой. И даже если я найду что -то, что может быть связано, мне трудно понять, что то, на что я смотрю, даже связано. Поэтому я подумал, что со мной все будет хорошо использовать 2D -методы.
Перемещение точки и масштабирования. Это не была проблемой, создающей меня, но часть вращения серьезно неправильно. Это было перемещено (но еще не повернуто) с использованием 2D -вычислений, совершенно хорошо. Координаты находятся в Стокгольме, Швеция. Допустим, N59.327 E18.055, так что немного на север.
Я попытался перемещать все точки рядом с экватором, а затем он создает лучший круг, который кажется правильным. Но круглые расчеты должны учитывать весь круг/сферу? Я не знаю.internal class DoublePoint
{
internal double Latitude;
internal double Longitude;
internal DoublePoint()
{
Latitude = 0.0;
Longitude = 0.0;
}
internal DoublePoint(double longitude, double latitude)
{
Latitude = latitude;
Longitude = longitude;
}
public override string ToString()
{
return Longitude.ToString().Replace(",", ".") + ", " + Latitude.ToString().Replace(",", ".");
}
}
internal class DoubleVector
{
internal DoublePoint A;
internal DoublePoint B;
internal DoubleVector(DoublePoint a, DoublePoint b)
{
{
A = a;
B = b;
}
}
}
public static DoublePoint RelativeMove(DoublePoint what, DoubleVector vecFrom, DoubleVector vecTo, double angle = 0.0, bool skipRotate = false)
{
double scale = Scale(vecFrom, vecTo);
DoublePoint p = new DoublePoint();
p.Latitude = vecTo.A.Latitude + ((what.Latitude - vecFrom.A.Latitude) * scale);
p.Longitude = vecTo.A.Longitude + ((what.Longitude - vecFrom.A.Longitude) * scale);
// Fine until this point.
if (skipRotate)
return p;
else if (angle == 0.0)
return RotateAroundPoint2(p, vecTo.A, RelativeAngle(vecFrom, vecTo));
else
return RotateAroundPoint2(p, vecTo.A, angle);
}
public static DoublePoint RotateAroundPoint3(DoublePoint pt, DoublePoint center, double degree)
{
double x1, x2, y1, y2;
x1 = center.Longitude;
y1 = center.Latitude;
x2 = pt.Longitude;
y2 = pt.Latitude;
double distance = Math.Sqrt(Math.Pow((x2 - x1), 2) + Math.Pow((y2 - y1), 2));
degree *= (float)(Math.PI / 180);
double x3, y3;
x3 = distance * Math.Cos(degree) + x1;
y3 = distance * Math.Sin(degree) + y1;
return new DoublePoint(x3, y3);
}
public static DoublePoint RotateAroundPoint(DoublePoint pointToRotate, DoublePoint centerDoublePoint, double angleInDegrees)
{
double angleInRadians = 0 - angleInDegrees * (Math.PI / 180.0);
double sinTheta = Math.Sin(angleInRadians);
double cosTheta = Math.Cos(angleInRadians);
DoublePoint p = pointToRotate;
p.Longitude -= centerDoublePoint.Longitude;
p.Latitude -= centerDoublePoint.Latitude;
double relLong = p.Longitude * cosTheta - p.Latitude * sinTheta;
double relLat = p.Longitude * sinTheta - p.Latitude * cosTheta;
p.Longitude = relLong + centerDoublePoint.Longitude;
p.Latitude = relLat + centerDoublePoint.Latitude;
return p;
}
public static DoublePoint RotateAroundPoint2(DoublePoint pointToRotate, DoublePoint centerDoublePoint, double angleInDegrees)
{
double angleInRadians = angleInDegrees * (Math.PI / 180.0);
double cosTheta = Math.Cos(angleInRadians);
double sinTheta = Math.Sin(angleInRadians);
DoublePoint temp = new DoublePoint(
(cosTheta * (pointToRotate.Longitude - centerDoublePoint.Longitude) -
sinTheta * (pointToRotate.Latitude - centerDoublePoint.Latitude) + centerDoublePoint.Longitude),
(sinTheta * (pointToRotate.Longitude - centerDoublePoint.Longitude) +
cosTheta * (pointToRotate.Latitude - centerDoublePoint.Latitude) + centerDoublePoint.Latitude)
);
return temp;
}
public static double RelativeAngle(DoubleVector src, DoubleVector dst)
{
return Angle(dst) - Angle(src);
}
public static double Angle(DoubleVector vec)
{
double longDiff = vec.B.Longitude - vec.A.Longitude;
double latDiff = vec.B.Latitude - vec.A.Latitude;
return Math.Atan2(latDiff, longDiff) * (180.0 / Math.PI);
}
public static double Scale(DoubleVector src, DoubleVector dst)
{
return Distance2(dst) / Distance2(src);
}
public static double Distance(DoubleVector vec)
{
DoublePoint diff = new DoublePoint();
diff.Latitude = Math.Abs(vec.A.Latitude - vec.B.Latitude);
diff.Longitude = Math.Abs(vec.A.Longitude - vec.B.Longitude);
return Math.Sqrt(Math.Pow(diff.Latitude, 2) + Math.Pow(diff.Longitude, 2));
}
public static double Distance2(DoubleVector vec)
{
var sCoord = new GeoCoordinate(vec.A.Latitude, vec.A.Longitude);
var eCoord = new GeoCoordinate(vec.B.Latitude, vec.B.Longitude);
return sCoord.GetDistanceTo(eCoord) * 1.2;
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... -or-sphere
Рассчитайте вращение точки вокруг другой точки на Земле (или сфере) ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение