RotateTransform и тригонометрическая формула не согласуются, объекты на холсте смещеныC#

Место общения программистов C#
Ответить
Anonymous
 RotateTransform и тригонометрическая формула не согласуются, объекты на холсте смещены

Сообщение Anonymous »

Я не смог найти разумного способа получить абсолютное положение объекта, к которому были применены преобразования на холсте, я решил использовать точку и применить к ней те же преобразования, что и объект, который я пытаюсь отслеживать. , тогда я буду знать, когда что-то сделать с объектом на основе координат точки.
Проблема начинается при применении вращения по тригонометрической формуле и сравнении его с функцией RotateTransform. Объекты не только не выровнены, что предполагает, что они не отображаются по одним и тем же правилам, например, сверху/слева от объекта, и, если мои очки не сильно смещены, круговая траектория кажется искаженной при вычислении ее по формуле . Я особенно не верю, что математика перестала работать именно на моем компьютере.
Посмотрите на рисунок ниже: я нарисовал вертикальные/горизонтальные линии, чтобы указать центр холста, а затем создал несколько повернутых эллипсов. на возрастающие 45 градусов: синие с RotateTransform и красные с тригонометрической формулой. Синий цвет правильный, а красный можно увидеть не только смещенным, но и вращающимся с неожиданной скоростью.
[img]https:/ /i.sstatic.net/ylCu5b0w.jpg[/img]

Применяемая логика:
  • Цикл накапливает угол: 0, 45, 90...
  • 3 точки: центр холста, координата Y преобразована в радиус расстояния до центра, повернутая точка используется для построения красных кругов
    Синие круги используют TransformGroup с TranslateTransform и RotateTransform
XAML: C#:

Код: Выделить всё

using System.Windows;
using System.Windows.Media;
using System.Windows.Shapes;

namespace Angle
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

int    increment = 45,
segments  = 360 / increment;
double radius    = 150.0,
angle     = 0.0;

Point origin;
origin.X = cv.Width / 2;
origin.Y = cv.Height / 2;

Line verLine = new Line() { X1 = origin.X, X2 = origin.X, Y1 = 0, Y2 = cv.Height },
hrzLine = new Line() { X1 = 0, X2 = cv.Width, Y1 = origin.Y, Y2 = origin.Y };

verLine.Stroke = hrzLine.Stroke = Brushes.Black;
verLine.StrokeThickness = hrzLine.StrokeThickness = 1;

cv.Children.Add(verLine);
cv.Children.Add(hrzLine);

for (int i = 0; i < segments; i++)
{
Point translated, rotated;

Ellipse usingMath      = new Ellipse() { Width = 20, Height = 20 },
usingTransform = new Ellipse() { Width = 20, Height = 20 };

translated.X = origin.X;
translated.Y = origin.Y + radius;
rotated.X = (Math.Cos(angle * Math.PI / 180) * (translated.X - origin.X) - Math.Sin(angle * Math.PI / 180) * (translated.Y - origin.Y) + origin.X);
rotated.Y = (Math.Sin(angle * Math.PI / 180) * (translated.X - origin.X) + Math.Cos(angle * Math.PI / 180) * (translated.Y - origin.Y) + origin.Y);
usingMath.RenderTransform   = new TranslateTransform() { X = rotated.X, Y = rotated.Y };

TransformGroup transf = new TransformGroup();
transf.Children.Add(new TranslateTransform() { X = translated.X, Y = translated.Y });
transf.Children.Add(new RotateTransform()    { Angle = angle, CenterX = origin.X, CenterY = origin.Y });
usingTransform.RenderTransform = transf;

usingMath.StrokeThickness = usingTransform.StrokeThickness = 4;
usingMath.Stroke      = Brushes.Red;
usingTransform.Stroke = Brushes.Blue;

cv.Children.Add(usingMath);
cv.Children.Add(usingTransform);

angle += increment;
}
}
}
}
Я просматривал это снова и снова, и, должно быть, где-то есть явная ошибка или я забыл что-то сделать, и, может быть, вы поможете мне определить, в чем дело?

Подробнее здесь: https://stackoverflow.com/questions/785 ... ned-in-can
Ответить

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

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

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

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

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