.Net GDI+ — поворот в фиксированной точкеC#

Место общения программистов C#
Ответить
Anonymous
 .Net GDI+ — поворот в фиксированной точке

Сообщение Anonymous »

Мне нужно нарисовать объекты в определенном месте, но повернутые на определенный угол, при этом объект «кажется» пользователю все еще нарисованным в введенном месте x/y.Например, если квадрат был повернут на 45 градусов, самый левый угол квадрата должен находиться в введенном месте «X». Просто используя Graphics.RotateTransform(45), а затем нарисовав квадрат, поскольку он повернут, «левая» точка теперь будет отображаться левее, чем ожидалось. Поворот квадрата на целых 90 градусов будет занимать всю ширину квадрата слева от «X».
[img]https://i .sstatic.net/9zjdFXKN.png[/img]

В приведенном выше примере первая строка изображений — это если я просто вызываю «Graphics.TranslateTransform(x,y); Graphics.RotateTransform(deg);'
Вторая строка — это результат, которого я хочу достичь
e.Graphics.DrawLine(Pens.Firebrick, 100, 138, 200, 138);
e.Graphics.DrawLine(Pens.Firebrick, 300, 138, 400, 138);
e.Graphics.DrawLine(Pens.Firebrick, 500, 138, 600, 138);
e.Graphics.DrawLine(Pens.Firebrick, 700, 138, 800, 138);

e.Graphics.TranslateTransform(100, 140);
e.Graphics.DrawRectangle(Pens.Fuchsia, 0, 0, 100, 20);
e.Graphics.ResetTransform();

e.Graphics.TranslateTransform(300, 140);
e.Graphics.RotateTransform(45);
e.Graphics.DrawRectangle(Pens.Fuchsia, 0, 0, 100, 20);
e.Graphics.ResetTransform();

e.Graphics.TranslateTransform(500, 140);
e.Graphics.RotateTransform(90);
e.Graphics.DrawRectangle(Pens.Fuchsia, 0, 0, 100, 20);
e.Graphics.ResetTransform();

e.Graphics.TranslateTransform(700, 140);
e.Graphics.RotateTransform(315);
e.Graphics.DrawRectangle(Pens.Fuchsia, 0, 0, 100, 20);
e.Graphics.ResetTransform();

Я могу вычислить фактическую ширину/высоту прямоугольника после его поворота на:
var deg = 45;
var rad = deg * (Math.PI / 180);
var h = 20;
var w = 100;
var objH = h * Math.Abs(Math.Cos(rad)) + w * Math.Abs(Math.Sin(rad));
var objW = w * Math.Abs(Math.Cos(rad)) + h * Math.Abs(Math.Sin(rad));

Но мне трудно найти способ использовать это вместе с градусами поворота для указания значения в вызове TranslateTransform для достижения того, что я ищу.< /p>
Я придумал обходной путь: рисовать растровое изображение, а затем просто рисовать это растровое изображение в позиции x/y, но это не лучшее решение, поскольку оно довольно неэффективно. и в моем случае целью этого является PDF-документ и изображение не будет векторным и поэтому не будет правильно масштабироваться/масштабироваться. Я тоже буду писать текст в этих фигурах, так что это тоже будет выглядеть плохо... Обходной путь:
e.Graphics.DrawLine(Pens.Firebrick, 100, 138, 200, 138);

var deg = 45;
var rad = deg * (Math.PI / 180);
var h = 20;
var w = 100;
var objH = h * Math.Abs(Math.Cos(rad)) + w * Math.Abs(Math.Sin(rad));
var objW = w * Math.Abs(Math.Cos(rad)) + h * Math.Abs(Math.Sin(rad));

var img = new Bitmap((int)objW, (int)objH);
img.MakeTransparent();
var sub = Graphics.FromImage(img);
//sub.FillRectangle(Brushes.Green, 0, 0, (int)objW, (int)objH);

sub.TranslateTransform(
((float)objW / 2f), ((float)objH / 2f), MatrixOrder.Append);

sub.RotateTransform(deg);

sub.DrawRectangle(
Pens.Fuchsia,
-(w / 2),
-(h / 2),
w,
h);

sub.ResetTransform();
sub.Dispose();
e.Graphics.DrawImage(img, 100, 140);


Подробнее здесь: https://stackoverflow.com/questions/792 ... ixed-point
Ответить

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

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

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

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

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