Рассчитайте вращение точки вокруг другой точки на Земле (или сфере)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.

return RotateAroundPoint(p, vecTo.A, RelativeAngle(vecFrom, vecTo));
}

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 Distance(dst) / Distance(src);
}

public static double Distance(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;
}
< /code>
Обновление:
Вот очень грубый пример на сфере движения и вращения, которые я пытаюсь достичь, используя те же цвета, что и пример ниже. Вращение, которое я хочу сделать, намного меньше. В большинстве случаев около 100 м точка в пункт. Похоже, что он создает 2D -плоскость, чтобы сделать вращение на основе точки, которая опускается с поверхности, чтобы соответствовать поверхности диаметра. Я просто не понимаю, как туда добраться. было: < /p>

Переместить его относительно из базовой точки источника (голубой) в базовую точку назначения (пурпурный). Работа в черном. В конечном итоге с розовым. Но когда я использую его на сфере (Земля), круг вокруг основания назначения становится эллиптическим, что, я предполагаю, из -за кривизны сферы. < /P>
Вот пример в Winforms: < /p>
using System;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;

namespace Example1
{
public partial class Form1 : Form
{
Pen Red = new Pen(Color.Red, 5);
Pen Blue = new Pen(Color.Blue, 5);
Pen Green = new Pen(Color.Green, 10);
Pen Cyan = new Pen(Color.Cyan, 10);
Pen Magenta = new Pen(Color.Magenta, 10);
Pen Lime = new Pen(Color.Lime, 10);
Pen Pink = new Pen(Color.Pink, 10);
Pen Black = new Pen(Color.Black, 2);
Pen Purple = new Pen(Color.Purple, 2);
Pen Yellow = new Pen(Color.Yellow, 2);

public Form1()
{
InitializeComponent();

this.Size = new System.Drawing.Size(800, 800);

PictureBox pictureBox1 = new PictureBox();
pictureBox1.Width = 800;
pictureBox1.Height = 800;
this.Controls.Add(pictureBox1);

Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);

Vector src = new Vector(new Point(500, 500), new Point(700, 500));
Vector dst = new Vector(new Point(150, 600), new Point(700, 50));

Point pointToMove = new Point(525, 525);
Point resultNoRotate = RelativeMove(pointToMove, src, dst, false);
Point result = RelativeMove(pointToMove, src, dst);

using (Graphics g = Graphics.FromImage(bmp))
{
// Draw source line with A as anchor point
g.DrawLine(Blue, src.A, src.B);
g.DrawEllipse(Cyan, src.A.X - 5, src.A.Y - 5, 10, 10);

// Draw destination line with A as anchor point
g.DrawLine(Red, dst.A, dst.B);
g.DrawEllipse(Magenta, dst.A.X - 5, dst.A.Y - 5, 10, 10);

// Draw original point relative to source
g.DrawEllipse(Lime, pointToMove.X - 5, pointToMove.Y - 5, 10, 10);

// Draw point that has been moved (src.A to dst.A) and scaled(length of destination / length of source) but not rotated
g.DrawEllipse(Green, resultNoRotate.X - 5, resultNoRotate.Y - 5, 10, 10);

// Draw point that has been moved, scaled and rotated into the position I want
g.DrawEllipse(Pink, result.X - 5, result.Y - 5, 10, 10);

// Move calulation representation
g.DrawLine(Black, src.A, dst.A);

// Rotation around axis dst.A. I tried making an arc but failed.
double dist = Distance(new Vector(dst.A, resultNoRotate));
g.DrawEllipse(Purple, (float)(dst.A.X-dist), (float)(dst.A.Y - dist), (float)(dist * 2), (float)(dist * 2));

// Starting point to finished point
g.DrawLine(Yellow, pointToMove, result);
}

pictureBox1.Image = bmp;
}

public static Point RelativeMove(Point what, Vector vecFrom, Vector vecTo, bool rotate = true)
{
double scale = Scale(vecFrom, vecTo);

Debug.Print(scale.ToString());

Point p = new Point();

p.X = (int)((double)vecTo.A.X + ((what.X - vecFrom.A.X) * scale));
p.Y = (int)((double)vecTo.A.Y + ((what.Y - vecFrom.A.Y) * scale));
Console.WriteLine("This: " + (int)((double)vecTo.A.Y + ((what.Y - vecFrom.A.Y) * scale)));
Console.WriteLine("p.Y: " + p.Y);
if (!rotate)
return p;

return RotateAroundPoint(p, vecTo.A, RelativeAngle(vecFrom, vecTo));
}

public static Point RotateAroundPoint(Point pointToRotate, Point centerPoint, double angleInDegrees)
{
double angleInRadians = angleInDegrees * (Math.PI / 180.0);
double cosTheta = Math.Cos(angleInRadians);
double sinTheta = Math.Sin(angleInRadians);

Point temp = new Point(
(int)
(cosTheta * (pointToRotate.X - centerPoint.X) -
sinTheta * (pointToRotate.Y - centerPoint.Y) + centerPoint.X),
(int)
(sinTheta * (pointToRotate.X - centerPoint.X) +
cosTheta * (pointToRotate.Y - centerPoint.Y) + centerPoint.Y)
);

return temp;
}

public static double Scale(Vector src, Vector dst)
{
return Distance(dst) / Distance(src);
}

public static double Distance(Vector vec)
{
Point diff = new Point();
diff.X = Math.Abs(vec.A.X - vec.B.X);
diff.Y = Math.Abs(vec.A.Y - vec.B.Y);

return Math.Sqrt(diff.X * diff.X + diff.Y * diff.Y);
}

public static double RelativeAngle(Vector src, Vector dst)
{
Console.WriteLine((Angle(dst) - Angle(src)));
return Angle(dst) - Angle(src);
}

public static double Angle(Vector vec)
{
double diffX = vec.B.X - vec.A.X;
double diffY = vec.B.Y - vec.A.Y;
return Math.Atan2(diffY, diffX) * (180.0 / Math.PI);
}

public class Vector
{
public Point A;
public Point B;

public Vector(Point a, Point b)
{
A = a;
B = b;
}
}
}
}
< /code>
Обновление:
удален неиспользованный код. 17.9999819777391
Destination A:
59.3250343436533 17.9958144704476
Destination B:
59.3261225537402 17.9957850937422
Направлять для перемещения:
59.3237129908632 17.998727886078 < /p>
Ожидание:
59.3255056697155 17.9963157189239 < /p>
, пожалуйста, не стоит atplet, но не стоит. Я бы сказал, что +/- 0,000010 0,000005 будет правильным, но другие части моих расчетов могут изменить это число чуть выше.

Подробнее здесь: https://stackoverflow.com/questions/797 ... -or-sphere
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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