Рассчитайте вращение точки вокруг другой точки на Земле (или сфере)C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Рассчитайте вращение точки вокруг другой точки на Земле (или сфере)

Сообщение Anonymous »

По сути, то, что я пытаюсь сделать, - это перемещение точки относительно двух разных шкал.
Причина в том, чтобы редактировать значения в базе данных 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Рассчитайте вращение точки вокруг другой точки на Земле (или сфере)
    Anonymous » » в форуме C#
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Рассчитайте вращение точки вокруг другой точки на Земле (или сфере)
    Anonymous » » в форуме C#
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Рассчитайте вращение точки вокруг другой точки на Земле (или сфере)
    Anonymous » » в форуме C#
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Рассчитайте вращение точки вокруг другой точки на Земле (или сфере)
    Anonymous » » в форуме C#
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Рассчитайте вращение точки вокруг другой точки на Земле (или сфере)
    Anonymous » » в форуме C#
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»