• 0
Geex

Странное отображение DrawPath

Вопрос

Привет, Всем!

 

 

 

Заметил странности отображения ломанных линий с помощью DrawPath. При острых углах ломанной она начинает выходить за координаты точек излома. Как на рисунке:

post-145-0-01705800-1399053313.png

 

Красным цветом построена линия с помощью DrawLine, зеленой с помощью DrawPath по одним и тем же координатам.

procedure TFMain.Button1Click(Sender: TObject);
var
Pa:TPathData;
p1,p2,p3,p4:TPointF;
begin
  p1:=PointF(10,10);
  p2:=PointF(200,20);
  p3:=PointF(10,30);
  p4:=PointF(400,40);

  Pa:=TPathData.Create;
  Pa.MoveTo(p1);
  Pa.LineTo(p2);
  Pa.LineTo(p3);
  Pa.LineTo(p4);

  PaintBox.Bitmap.Canvas.BeginScene;
  PaintBox.Bitmap.Canvas.Stroke.Color:=claGreen;
  PaintBox.Bitmap.Canvas.Stroke.Thickness:=1;//PenWidth;
  PaintBox.Bitmap.Canvas.DrawPath(Pa,1.0);
  PaintBox.Bitmap.Canvas.EndScene;
  Pa.Free;

  PaintBox.Bitmap.Canvas.BeginScene;
  PaintBox.Bitmap.Canvas.Stroke.Color:=claRed;
  PaintBox.Bitmap.Canvas.DrawLine(p1,p2,1.0);
  PaintBox.Bitmap.Canvas.DrawLine(p2,p3,1.0);
  PaintBox.Bitmap.Canvas.DrawLine(p3,p4,1.0);
  PaintBox.Bitmap.Canvas.DrawLine(p1,p2,1.0);
  PaintBox.Bitmap.Canvas.EndScene;
end;

Можно заметить что зеленая линия немножко выходит за красную. Этого можно избежать только если строить линию с разрывами.

Подозреваю что это связано с радиусом загиба кривой, вот только где его убрать?

Можно как-нибудь элегантно сделать чтобы кривая линия строилась точно по координатам с помощью DrawPath?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1 ответ на этот вопрос

  • 0

Нужно указать способ соединения линий:

PaintBox.Bitmap.Canvas.Stroke.Join := TStrokeJoin.Bevel;

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость
Эта тема закрыта для публикации сообщений.

  • Похожие публикации

    • Автор: Maximus
      Доброго всем времени суток. Хочу снова поднять вопрос про отрисовку линий на канве, обсуждавшейся здесь
      С горизонтальными и вертикальными линиями проблем нет, при смещении на половину от толщины линии всё прекрасно выглядит. Однако при отрисовке линий под различными углами такой финт не проходит: слева VCL, справа FMX

      Линия всё так же размазывается, в итоге визуально утолщается и становится не такой чёткой.
      Как всё же добиться такого же результата как на VCL? Интересует только Windows.
      const OFFSET_LINE = 0.5; ... Image.Bitmap.Canvas.BeginScene; Image.Bitmap.Canvas.Stroke.Kind := TBrushKind.Solid; Image.Bitmap.Canvas.Stroke.Thickness := 1.0; Image.Bitmap.Canvas.DrawLine( PointF(10.0 - OFFSET_LINE, 10.0 - OFFSET_LINE), PointF(500.0 - OFFSET_LINE, 10.0 - OFFSET_LINE), 1.0); Image.Bitmap.Canvas.DrawLine( PointF(10.0 - OFFSET_LINE, 10.0 - OFFSET_LINE), PointF(10.0 - OFFSET_LINE, 500.0 - OFFSET_LINE), 1.0); Image.Bitmap.Canvas.DrawLine( PointF(10.0 - OFFSET_LINE, 10.0 - OFFSET_LINE), PointF(500.0 - OFFSET_LINE, 500.0 - OFFSET_LINE), 1.0); Image.Bitmap.Canvas.EndScene;  
    • Автор: ader
      Задача: нужно рисовать много составных полигонов (с дырками). В gdi+ использовал Path.AddPolygon, в FireMonkey такой функции нет. Заполнять строку Path.Data - сомневаюсь в производительности такого метода (полигон может состоять из тысяч точек).
      Какие ещё могут быть варианты?
    • Автор: jekans
      Подскажите пожалуйста глупому человеку , как можно загрузив изображение:
      buf: TBitmap; buf.LoadFromFile('.bmp'); Определить цвет нужного мне пикселя (X,Y), и нарисовать хотя бы линию этого цвета на форме используя обычный: 
      Canvas.DrawLine    
    • Автор: Geex
      Приветствую!
      Не понятная ситуация с шириной линии. Рисую горизонтальную линию на канве толщиной толщиной 1 пиксель. 
      Если линия лежит вдоль целых координат, например Y=100 то толщина линии реально получается 2 пикселя.
      А если координаты дробные, например 50.5 то линия в один пиксель. Вот как это выглядит:

      Т.е. я так понимаю, что координаты канвы начинаются не с нуля, а с 0.5.
      Как сделать чтобы отображение целых координат было точно в пиксель?
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу