По сути, то, что я пытаюсь сделать, - это перемещение точки относительно двух разных шкал.
Причина в том, чтобы редактировать значения в базе данных 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
Рассчитайте вращение точки вокруг другой точки на Земле (или сфере) ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение