Перейти к содержанию
Fire Monkey от А до Я

Geex

Пользователи
  • Постов

    4
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Geex

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

     

     

     

    Заметил странности отображения ломанных линий с помощью 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?

     

  2. Спасибо!

     

    Задача решена, через вычитание из координат половины толщины пера Canvas.Stroke.Thickness / 2, очень грубо, как здесь:

    procedure TForm2.FormPaint(Sender: TObject; Canvas: TCanvas;
      const ARect: TRectF);
    var
      I: Integer;
    begin
      if Canvas.BeginScene then
        try
          Canvas.Stroke.Thickness := 1.5;
          Canvas.Stroke.Kind := TBrushKind.bkSolid;
          Canvas.Fill.Color := TAlphaColorRec.Black;
          Canvas.Fill.Kind := TBrushKind.bkSolid;
     
          for I := 1 to 9 do
          begin
            Canvas.DrawLine(PointF(50 + I * 25 - (Canvas.Stroke.Thickness / 2), 0),
              PointF(50 + I * 25 - (Canvas.Stroke.Thickness / 2), ClientHeight), 1);
          end;
        finally
          Canvas.EndScene;
        end;
    end;
    

    К сожалению через функцию RoundLogicPointsToMatchPixel не получилось:

    function TForm2.RoundLogicPointsToMatchPixel(const LogicPoints: Single;
      const AtLeastOnePixel: Boolean = False): Single;
    var
      ws: IFMXWindowService;
      ScreenScale, Pixels: Single;
    begin
      ws := TPlatformServices.Current.GetPlatformService(IFMXWindowService) as IFMXWindowService;
      ScreenScale := ws.GetWindowScale(Self);
     
      // Maybe you will want to use Ceil or Trunc instead of Round
      Pixels := Round(LogicPoints * ScreenScale);
     
      if (Pixels < 1) and (AtLeastOnePixel) then
        Pixels := 1.0;
     
      Result := Pixels / ScreenScale;
    end;
    

    Так как LogicPoints=ScreenScale=1 .

  3. Приветствую!

    Не понятная ситуация с шириной линии. Рисую горизонтальную линию на канве толщиной толщиной 1 пиксель. 

    Если линия лежит вдоль целых координат, например Y=100 то толщина линии реально получается 2 пикселя.

    А если координаты дробные, например 50.5 то линия в один пиксель. Вот как это выглядит:

    post-145-0-29967500-1398688559_thumb.png

    Т.е. я так понимаю, что координаты канвы начинаются не с нуля, а с 0.5.

    Как сделать чтобы отображение целых координат было точно в пиксель?

×
×
  • Создать...