Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Нарисовать


Автор: Zorak 10.2.2009, 19:18
Вот написал програму, которая рисует кривие безье... факт в том, что роботает она нормально, но.... НЕ рисует линий(((... при запуске проги появляется вот такое: http://pic.ipicture.ru/uploads/090210/7389/wSzc0X2l0N.jpg, а должно появится вот ето: http://pic.ipicture.ru/uploads/090210/7389/CVoi66qV7x.jpg, я уже не знаю что думать и как его сделать(((.. помогите пжлста, я подозреваю, что ничего сложного в етом нету, но никак нимагу вникнуть(((...
З.Ы. рисует не от точки к точке, а через две точки... тоесть с нулевой линия идет в третю точку.. на месте третей стоит четвертая, откуда линия идет в седьмую и т п).. вот рисунок: http://pic.ipicture.ru/uploads/090210/7389/EqVZ9Qm8AO.jpg
З.Ы. проект виложил в архиве

Автор: Snowy 10.2.2009, 19:49
Код

     if RGroupDrawMethod.ItemIndex=0 then
      begin
       Canvas.Pen.Style:=psDot;
       Canvas.Pen.Width:=1;
       Canvas.Pen.Color:=clDkGray;
       for i := 0 to High(Curve) - 1 do
       begin
         Canvas.MoveTo(Curve[i].X,Curve[i].Y);
         Canvas.LineTo(Curve[i+1].X,Curve[i+1].Y);
       end;
       { // Сам так рисуешь
       Canvas.MoveTo(Curve[0].X,Curve[0].Y);
       Canvas.LineTo(Curve[1].X,Curve[1].Y);
       Canvas.MoveTo(Curve[3].X,Curve[3].Y);
       Canvas.LineTo(Curve[2].X,Curve[2].Y);
       Canvas.MoveTo(Curve[4].X,Curve[4].Y);
       Canvas.LineTo(Curve[5].X,Curve[5].Y);
       Canvas.MoveTo(Curve[7].X,Curve[7].Y);
       Canvas.LineTo(Curve[6].X,Curve[6].Y)
       }

Автор: Zorak 10.2.2009, 19:55
Snowy , ти меня немного неправильно понял... вот аналогичная програма, только для 4 точок и 1 линии.. =)... мне из етого надо сделать две линии...
Цитата
рисует не от точки к точке, а через две точки... тоесть с нулевой линия идет в третю точку.. на месте третей стоит четвертая, откуда линия идет в седьмую и т п).. вот рисунок: вот)


Автор: Snowy 10.2.2009, 20:32
Ну ты сам просил линии...
Значит не рисует не линии, а кривые.
Значит не отрабатывает Canvas.PolyBezier
Что-то ты с точками напутал.
Например перетаскивание точек даёт странный эффект.
Вобщем что-то не так с точками. Тут сам разбирайся, выверяй, где напутал.
Например, урезав массив до 7 точек, всё работает.
Canvas.PolyBezier(Slice(LCurve, 7));
4 точки - Canvas.PolyBezier(Slice(LCurve, 4)); - тоже рисует.
Копни в эту сторону. Может где найдёшь ляп..

Автор: Zorak 10.2.2009, 20:34
Ок, спс, буду искать.. может кто первый додумается, то не молчите =) ... smile 
З.Ы. у мну чёт даже с твоим примером не рисует =)

Автор: Snowy 10.2.2009, 20:38
Если я правильно понял описание, то 3-я совпадает с 4-й.
Тогда в массиве должно быть не 8, а 7 точек.
Если 3-я и 4-я не совпадают, то получается дырка.
Значит каждая 4-я точка должна удаляться, при условии, что она не последняя.

Автор: Zorak 10.2.2009, 20:52
Цитата(Snowy @ 10.2.2009,  20:38)
Если я правильно понял описание, то 3-я совпадает с 4-й.
Тогда в массиве должно быть не 8, а 7 точек.
Если 3-я и 4-я не совпадают, то получается дырка.
Значит каждая 4-я точка должна удаляться, при условии, что она не последняя.

Да, ти правильно рассуждаеш), но я не могу вловить что ти хотел етим сказать....
З.Ы. Ти говорил, что када урезаеш масив, то всё работает.. не мог бы ти исходник выложить ?)

Автор: Zorak 10.2.2009, 22:12
Вообщем ету проблему решил.. но както так получилось, что перестало работать второе((... smile  вщитуя то, что сопадают 3 и 4, 7 и 8, 11 и 12, 15 и 1 точки... - то не правильно рисует кривую в 7 и 8 точках ((... с индексами точок в коде всё в порядке, раз 10 проверил...  что здесь не так ?(... Помогите пжлста добить ету програму) smile ...
http://pic.ipicture.ru/uploads/090210/7389/Ycv7255TnU.jpg

Автор: rounin 11.2.2009, 17:37
У тебя такой код, что сам чёрт ногу сломит. 
Там можно до посинения глюки ловить. 
Зачем такие сложности, почему бы не написать что-нибудь простенькое, вроде

Код

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    procedure PaintBox1Paint(Sender: TObject);
    procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    FCurve: array of TPoint;
    FDragIndex: Integer;
  public
    procedure InitPoints(const APoints: array of TPoint);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function PtNearPt(X, Y: Integer; const Pt: TPoint): Boolean;
begin
  Result := (X>=Pt.X-3)and(X<=Pt.X+3)and(Y>=Pt.Y-3)and(Y<=Pt.Y+3);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  PaintBox1.ControlStyle := PaintBox1.ControlStyle + [csOpaque];

  InitPoints(
    [Point(100, 100), Point(200, 100), Point(300, 100),
     Point(400, 100), Point(400, 200), Point(400, 300),
     Point(400, 400), Point(300, 400), Point(200, 400),
     Point(100, 400), Point(100, 300), Point(100, 200),
     Point(100, 100)]);
end;

procedure TForm1.InitPoints(const APoints: array of TPoint);
var i, L: Integer;
begin
  L := Length(APoints);
  if L mod 3 <> 1 then
    raise Exception.Create('Bezier: Invalid point number');

  SetLength(FCurve, L);
  for i := 0 to L-1 do
    FCurve[i] := APoints[i];
end;


procedure TForm1.PaintBox1Paint(Sender: TObject);
var i, k, L, N: Integer;
    pt: TPoint;
begin
  with Sender as TPaintBox do
  begin
    Canvas.Pen.Style := psSolid;
    Canvas.Pen.Color := clBlack;
    Canvas.Brush.Style := bsSolid;
    Canvas.Rectangle(ClientRect);

    {-- Bezier itself --}
    Canvas.PolyBezier(FCurve);

    L := Length(FCurve);

    {-- Point markers --}
    Canvas.Pen.Color := clRed;
    for i := 0 to L-1 do
    begin
      pt := FCurve[i];
      Canvas.Rectangle(pt.X - 3, pt.Y - 3, pt.X + 3, pt.Y + 3);
    end;

    {-- Dotted lines ---}
    N := L div 3;
    Canvas.Pen.Style := psDot;
    Canvas.Pen.Color := clBlue;
    Canvas.Brush.Style := bsClear;
    for i := 0 to N-1 do
    begin
      k := i*3;
      Canvas.MoveTo(FCurve[k].X,   FCurve[k].Y);
      Canvas.LineTo(FCurve[k+1].X, FCurve[k+1].Y);
      Canvas.MoveTo(FCurve[k+2].X, FCurve[k+2].Y);
      Canvas.LineTo(FCurve[k+3].X, FCurve[k+3].Y);
    end;
    Canvas.Pen.Style := psSolid;
  end;
end;

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var i: Integer;
begin
  FDragIndex := -1;
  for i := 0 to Length(FCurve)-1 do
    if PtNearPt(X, Y, FCurve[i]) then
    begin
      FDragIndex := i;
      Break;
    end;
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if (ssLeft in Shift)and(FDragIndex <> -1)then
  begin
    FCurve[FDragIndex] := Point(X, Y);
    (Sender as TPaintBox).Refresh;
  end;
end;

Автор: Zorak 21.2.2009, 14:32
Спасибо. диствительно проще...))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)