Конференция "Media" » Проблема с отрисовкой Image.
 
  • Алекс (27.07.08 23:16) [0]
    Здравствуйте, возник такой вопрос:
    В программе есть процедура, котрая рандомно в поле Image должна расставлять определенное кол-во точек.
    Проблема заключается в том, что после выполнения процедуры форма остается совершенно чистой.
    На форме находится только компоненты Image и Button, по нажатию кнопки выполняется процедура.
    Возможно здесь надо использовать другой компонент(не Image), впервые сталкиваюсь с графикой, поэтому не знаю.
    Материалов по работе с этим компонентом не нашел, а OnPaint использовать не выгодно, т.к. столкнемся с проблемой перерисовки формы в случае ее перекрытия.  
    Заранее благодарен за ответ.

    Заголовок:
    procedure Randpix(var Image:TImage; typcard:Char; Numb:integer; cm:integer);



    Код процедуры:

    procedure Randpix;
    var
    rndX,rndY,i,col:integer;
    size:integer;

    Function N(Numb:integer):integer;
    begin
    if numb=1 then n:=8
    else n:=N(numb-1)*2;
    end;

    Procedure pix(x,y,size:integer); //отрисовка точки
    begin
    Image.Canvas.MoveTo(x,y);
    Image.Canvas.Pen.Width:=size;
    Image.Canvas.LineTo(x,y);
    end;

    begin
    randomize;
    col:=n(numb);
    if ((typcard='A') or (typcard='C')) then
     begin
      size:=round(cm/10);
     end
    else
    begin
     size:=round(cm/10*2);
    end;
    For i:=1 to col do
    begin
    rndX:=random(Image.Width-size)+round(size/2);
    rndY:=random(Image.Height-size)+round(size/2);
    pix(rndX,rndY,size);
    end;
    end;

  • {RASkov} © (28.07.08 00:36) [1]
    > [0] Алекс   (27.07.08 23:16)
    > Проблема заключается в том, что после выполнения процедуры
    > форма остается совершенно чистой.

    Проблема в твоем алгоритме, разбирать который я не стал....

    Можешь убедится, что с рисованием все в порядке вот так:
    procedure Randpix(Image: TImage);
    var N: Integer;
    begin
     for N:=0 to 10 do begin
      Image.Canvas.MoveTo(Random(Image.Width), Random(Image.Height));
      Image.Canvas.LineTo(Random(Image.Width), Random(Image.Height));
     end;
    end;



    Вызов:
    Randpix(Image1);



    Изучай свои расчеты внутри своей процедуры.....
  • {RASkov} © (28.07.08 00:38) [2]
    Черт....

    > Procedure pix(x,y,size:integer); //отрисовка точки
    > begin
    > Image.Canvas.MoveTo(x,y);
    > Image.Canvas.Pen.Width:=size;
    > Image.Canvas.LineTo(x,y);
    > end;

    Интересная отрисовка точки :)
  • {RASkov} © (28.07.08 00:49) [3]
    Попробуй вместо [2] сделать нечто так:
    Procedure pix(x,y,size:integer); //отрисовка точки
    begin
     Image.canvas.ellipse(x-size div 2, y-size div 2, x+size div 2, y+size div 2);
    end;


    а перед циклом вызовов pix поместить такую строчку:
    image.Canvas.Brush.Color:=Image.Canvas.Pen.Color;

  • {RASkov} © (28.07.08 00:57) [4]
    > Randpix

    > pix

    Может лучше:
    RandPoint
    Point


    или
    RandSpot
    Spot


    ? :)
    А то как-то на "пискел" (с) это не похоже
  • Алекс (28.07.08 01:02) [5]
    RASkov, да, действительно линии рисует. Последний вариант не помог, все чисто. Буду мониторить расчеты.
  • Алекс (28.07.08 01:03) [6]
    Не ) Точка - это условное название :)) Диаметр будет 1-2 мм, поэтому таким образом и рисую :D
  • {RASkov} © (28.07.08 01:04) [7]
    > [5] Алекс   (28.07.08 01:02)

    покажи строку вызова.... т.е. с какими параметрами вызываешь Randpix из [0]
  • Алекс (28.07.08 01:07) [8]
    Randpix(Image1,'A',3,cm);


    cm - кол-во пикселей на 1 см, в моем случае 36.
  • {RASkov} © (28.07.08 01:10) [9]
    > [8] Алекс   (28.07.08 01:07)

    procedure Randpix(var Image:TImage; typcard:Char; Numb:integer; cm:integer);
    var
    rndX,rndY,i,col:integer;
    size:integer;

    Function N(Numb:integer):integer;
    begin
    if numb=1 then n:=8
    else n:=N(numb-1)*2;
    end;

    Procedure pix(x,y,size:integer); //отрисовка точки
    begin
     Image.Canvas.Ellipse(x-size div 2, y-size div 2, x+size div 2, y+size div 2);
    end;

    begin
    randomize;
    col:=n(numb);
    if ((typcard='A') or (typcard='C')) then
    begin
     size:=round(cm/10);
    end
    else
    begin
    size:=round(cm/10*2);
    end;
    image.Canvas.Brush.Color:=Image.Canvas.Pen.Color;
    For i:=1 to col do
    begin
    rndX:=random(Image.Width-size)+round(size/2);
    rndY:=random(Image.Height-size)+round(size/2);
    pix(rndX,rndY,size);
    end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
     Randpix(Image1, 'A', 3, 36);
    end;


    За твое форматирование, сорри :)
  • Алекс © (28.07.08 01:12) [10]
    Сейчас попробую :)
  • Алекс © (28.07.08 01:14) [11]
    Брр, так ничего не поменялось же окромя способа рисования точки :) Блин ) Уже торможу
  • Алекс © (28.07.08 01:15) [12]
    а, не ) Спасибо огромное ))) Косяк увидел.. В вызове процедуры он был.
 
Конференция "Media" » Проблема с отрисовкой Image.
Есть новые Нет новых   [134431   +11][b:0][p:0.002]