Geex

Пользователи
  • Публикаций

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

  • Посещение

Информация о Geex

  • Звание
    Новичок

Посетители профиля

254 просмотра профиля
  1. Привет, Всем! Заметил странности отображения ломанных линий с помощью DrawPath. При острых углах ломанной она начинает выходить за координаты точек излома. Как на рисунке: Красным цветом построена линия с помощью 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. В статье описаны проблемы с Андроидом, а тут Windows 7. Не понятно почему вообще такое получается, бред какой-то.
  3. Спасибо! Задача решена, через вычитание из координат половины толщины пера 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 .
  4. Приветствую! Не понятная ситуация с шириной линии. Рисую горизонтальную линию на канве толщиной толщиной 1 пиксель. Если линия лежит вдоль целых координат, например Y=100 то толщина линии реально получается 2 пикселя. А если координаты дробные, например 50.5 то линия в один пиксель. Вот как это выглядит: Т.е. я так понимаю, что координаты канвы начинаются не с нуля, а с 0.5. Как сделать чтобы отображение целых координат было точно в пиксель?