Мне нужно нарисовать объекты в определенном месте, но повернутые на определенный угол, при этом объект «кажется» пользователю все еще нарисованным в введенном месте 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
.Net GDI+ — поворот в фиксированной точке ⇐ C#
Место общения программистов C#
1733253522
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);
Подробнее здесь: [url]https://stackoverflow.com/questions/79248916/net-gdi-rotate-at-a-fixed-point[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия