![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как вращать строку с центром посредине строки? [D7, WinXP]
DAndrew © (2003-11-19 08:56:00)Как вращать строку с центром вращения посредине строки, а не в верхне-левом углу?
Вариант - рисовать текст на битмапе, а затем его вращать на заданный угол приводит к резким искажениям шрифта. Применение алгоритма антиалиазинга к битмапу сглаживает прорисовку, но резко тормозит систему.
Пожалуйста, практический пример или ссылку на подобный алгоритм!
Заранее благодарен!
Андрей!
DAndrew (2003-11-19 13:45:00) [21]_Zergey
Спасибо - проверю и напишу, что получилось!
Андрей!
DAndrew (2003-11-19 13:43:00) [22]MBo!
Спасибо, но это все же не то...
Опять таки поворот строки происходит с центром от первого символа строки ("неподвижная точка"), а мне необходимо, чтобы (по Вашему коду) левая и правая части строки (от Вашего эллипса в центре 0123456789---- о-----9876543210) вращались в противоположные стороны при задаваемых значениях угла от "-45" до "45" градусов! А центром вращения (" неподвижной точкой") оставалась точка, которую Вы обозначили, как эллипс послредине строки.
Я несколько дополнил Ваш код, посмотрите, может так Вам станет понятнее проблема. Кликая на кнопке строка должна "вертеться", подобно "детским качелям":
...................................
var
Form1: TForm1;
FAngle: Integer;
implementation
{$R *.dfm}
procedureTForm1.FormCreate(Sender: TObject);
begin
FAngle:= 0;
end;
procedureTForm1.Button1Click(Sender: TObject);
varLogFont: TLogFont;
s: string;
w, h, x, y:Integer;
begin
inc(FAngle, 200);
withImage1.Canvas do begin
Font.Name := 'Arial';
Font.Size := 24;
GetObject(Font.Handle, SizeOf(LogFont), @LogFont);
withLogFont do begin
lfOrientation := FAngle;
lfEscapement := lfOrientation; end;
Font.Handle := CreateFontIndirect(LogFont);
end;
s:='0123456789----9876543210';
Image1.Canvas.Ellipse(195, 195, 205, 205);
w:= Image1.Canvas.TextWidth (s);
h:= Image1.Canvas.TextHeight(s);
X:= 200 - Round( cos(Pi/6)*w + h*sin(Pi/6)) div 2;
Y:= 200 - Round(-sin(Pi/6)*w + h*cos(Pi/6)) div 2;
Image1.Canvas.TextOut(X, Y, s);
Image1.Canvas.Ellipse(200 - 5, 200 - 5, 200 + 5, 200 + 5);
end;
end.
Спасибо!
Андрей!
_Zergey (2003-11-19 13:35:00) [23]function AngleTextRect(DC:HDC;const AText:string;Left,Top:integer;
Angle:single;Alignment:TAlignment):TRect;
var
i,mw:integer;
Sz:TSize;
ARect:TRect;
Pt:array of TPoint;
begin
if Length(AText)=0 then Result:=Bounds(Left,Top,0,0) else
with TStringList.Create do
try
Text:=AText;
SetLength(Pt,(Count shl 2)+1);
mw:=0;
Int64(Pt[0]):=0;
for i:=0 to Count-1 do
begin
GetTextExtentPoint(DC,PChar(Strings[i]),Length(Strings[i]),Sz);
mw:=Max(mw,Sz.cx);
Pt[i+1].x:=Sz.cx;
Pt[i+1].y:=Pt[i].y+Sz.cy
end;
Objects[0]:=TObject(Pt[Count].y shr 1);
for i:=Count downto 1 do
with Sz do
begin
ARect.Left:=0;
ARect.Top:=Pt[i-1].y;
ARect.BottomRight:=Pt[i];
case Alignment of
taCenter:OffsetRect(ARect,((mw-WidthOf(ARect)) shr 1)+Left,Top);
taRightJustify:OffsetRect(ARect,mw-WidthOf(ARect)+Left,Top)
else OffsetRect(ARect,Left,Top)
end;
cy:=i shl 2;
with ARect do
begin
Pt[cy]:=BottomRight;
Dec(cy);
Pt[cy]:=Point(Left,Bottom);
Dec(cy);
Pt[cy]:=Point(Right,Top);
Dec(cy);
Pt[cy]:=TopLeft
end
end;
Pt[0]:=Point((mw shr 1)+Left,Integer(Objects[0])+Top);
RotatePt(Pt,Angle);
Result:=PolygonRect(Pt)
finally
Free
end
end;
procedure DrawRotatedText(DC:HDC;const Text:string;const ARect:TRect;
Angle:single;Alignment:TAlignment;Layout:TTextLayout);
begin
with AngleTextRect(DC,Text,ARect.Left,ARect.Top,-Angle,Alignment) do
begin
case Alignment of
taCenter:Left:=(WidthOf(ARect) shr 1)+ARect.Left;
taRightJustify:Left:=ARect.Right-((Right-Left) shr 1)
else Left:=((Right-Left) shr 1)+ARect.Left
end;
case Layout of
tlCenter:Top:=(HeightOf(ARect) shr 1)+ARect.Top;
tlBottom:Top:=ARect.Bottom-((Bottom-Top) shr 1)
else Top:=((Bottom-Top) shr 1)+ARect.Top
end;
AngledTextOut(DC,Text,Left,Top,-Angle,Alignment)
end
end;
MBo (2003-11-19 13:02:00) [24]>Ваша мысль - это все же прорисовка строки на битмапе и уже
поворот его
нет. Это именно вывод строки штатными средствами GDI (с сохранением антиалиасинга)
procedure TForm1.Button6Click(Sender: TObject);
var
LogFont: TLogFont;
s:string;
w,h,x,y:Integer;
begin
with Canvas do begin
Font.Name := 'Arial';
Font.Size := 24;
GetObject(Font.Handle, SizeOf(LogFont),@LogFont);
with LogFont do begin
lfOrientation := 300;
lfEscapement := lfOrientation;
end;
Font.Handle := CreateFontIndirect(LogFont);
end;
s:='0123456789----9876543210';
Canvas.Ellipse(195,195,205,205);
w:=Canvas.TextWidth(s);
h:=Canvas.TextHeight(s);
X:=200-Round(cos(Pi/6)*w+h*sin(Pi/6)) div 2;
Y:=200-Round(-sin(Pi/6)*w+h*cos(Pi/6)) div 2;
Canvas.TextOut(X,Y,s);
Canvas.Ellipse(200-5,200-5,200+5,200+5);
end;
DAndrew (2003-11-19 12:27:00) [25]MBo
Да, это все понятно, но как это практически "...и выводишь строку в рассчитаную позицию"?
Можете привести полный пример кода?
По-моему Ваша мысль - это все же прорисовка строки на битмапе и уже поворот его, а не собстенно строки. Или нет?
Спасибо!
MBo (2003-11-19 12:23:00) [26]Делаешь шрифт под углом
var
LogFont: TLogFont;
with MyCanvas do begin
Font.Name := 'Arial';
Font.Size := 24;
Font.Style := [fsBold];
GetObject(Font.Handle, @LogFont, SizeOf(LogFont));
with LogFont do begin
lfOrientation := 450; {set to 45 degrees}
lfEscapement := lfOrientation end;
Font.Handle := CreateFontIndirect(LogFont);
и выводишь строку в рассчитаную позицию
DAndrew (2003-11-19 11:41:00) [27]default - например, в какой-то момент буква "ф" может стать перевёрнутой?
Нет, угол поворота не должен превышать диапазона "-40" градусов и "40" градусов.
Теперь я ответил на Ваш вопрос?
Спасибо!
default (2003-11-19 11:21:00) [28]DAndrew (19.11.03 11:17) [8]
так и не ответил на вопрос, ну ладно
DAndrew (2003-11-19 11:17:00) [29]Да не совсем, ну вот, например возьмем строку:
Это строка для вращения
И в ней за центр поворота следует взять ее середину, например центр вращения где-то в сисмволе " д" (а символ это будет конкретно или нет - это уже дело случая!)
Теперь понятен смысл вопроса?
Спасибо!
default (2003-11-19 10:36:00) [30]точно?то есть, например, в какой-то момент буква "ф" может стать перевёрнутой?
DAndrew (2003-11-19 10:31:00) [31]всмысле вокруг своей оси, если за ось принять их центр
Да, например, если за центр принять центральный (или приходящийся на него) символ строки (если только это не пробел). А вращать неободимо всю строку! Попеременно в разные стороны (принимая поочередно положительные и отрицательные значения угла поворота строки).
И все же может кто-либо привести практический пример, а не теорию?
Спасибо!
default (2003-11-19 10:03:00) [32]всмысле вокруг своей оси, если за ось принять их центр
default (2003-11-19 10:02:00) [33]символы текста тоже должны вращаться?
nstur (2003-11-19 10:00:00) [34]Ребята, вопрос интереный, поделитесь для всех.
DAndrew (2003-11-19 09:34:00) [35]А как конкретно?
Приведите, пожалуйста, практический пример или отправьте мне его по почте. Как удобно.
Спасибо!
default (2003-11-19 09:11:00) [36]через уравнения концентрических окружностей?