Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2010, 16:34   #1
Danilka
Пользователь
 
Аватар для Danilka
 
Регистрация: 30.03.2010
Сообщений: 28
По умолчанию Графика: линия ступенькой

Здравствуйте!
прошу помочь с сабжем. чтобы было понятней о чем речь:


желательно чтобы во время рисования этой линии бегала за курсором пока не произойдет событие MouseUp (как в паинте при рисовании линии)
сижу уже 2й день и ничего не получается =( выкладывать то что уже написал не буду, тк там ничего толком и нет

ЗЫ если есть пример програмки с исходником поделитесь ею со мной плз или мануалом
Никогда и ничего не просите! Никогда и ничего, и в особенности у тех, кто сильнее вас. Сами предложат и сами все дадут! © Булгаков
Danilka вне форума Ответить с цитированием
Старый 10.12.2010, 16:38   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Mouse Move событие > Get Mouse Position -> расчет целевого пикселя -> отрисовка нужным цветом
BOBAH13 вне форума Ответить с цитированием
Старый 10.12.2010, 17:04   #3
Danilka
Пользователь
 
Аватар для Danilka
 
Регистрация: 30.03.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Mouse Move событие > Get Mouse Position -> расчет целевого пикселя -> отрисовка нужным цветом
Кэп, я немного другое прошу. я знаю что весь раcчет координат происходит в процедуре события MouseMove...

Перечитайте мой пост еще раз
Никогда и ничего не просите! Никогда и ничего, и в особенности у тех, кто сильнее вас. Сами предложат и сами все дадут! © Булгаков

Последний раз редактировалось Danilka; 10.12.2010 в 17:28.
Danilka вне форума Ответить с цитированием
Старый 10.12.2010, 17:11   #4
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Если не ошибаюсь, в Demo-примерах Delphi есть исходник (кажется, называется Graphex). Посмотри там как линия рисуется.
_SERGEYX_ вне форума Ответить с цитированием
Старый 10.12.2010, 17:33   #5
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Цитата:
Кэп, я немного другое прошу. я знаю что весь рачет координат происходит в процедуре события MouseMove...

Перечитайте мой пост еще раз
Вы прочитали только первую фразу из поста Вована13? Там все понятно написано... при передвижении мыши рассчитываете координату курсора, когда кнопку отпускаете, то у вас уже есть начальная координата и конечная, имея эти координаты, легко построить прямую линию по алгоритму Брезенхэма... http://ru.wikipedia.org/wiki/Алгоритм_Брезенхема Можно и канвасом и LineTo.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 10.12.2010 в 17:39.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 10.12.2010, 18:08   #6
Danilka
Пользователь
 
Аватар для Danilka
 
Регистрация: 30.03.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от _SERGEYX_ Посмотреть сообщение
Если не ошибаюсь, в Demo-примерах Delphi есть исходник (кажется, называется Graphex). Посмотри там как линия рисуется.
к сожалению в моей версии нет такого исходника =( но всеравно спасибо

Цитата:
Вы прочитали только первую фразу из поста Вована13? Там все понятно написано... при передвижении мыши рассчитываете координату курсора, когда кнопку отпускаете, то у вас уже есть начальная координата и конечная, имея эти координаты, легко построить прямую линию по алгоритму Брезенхэма...
Цитата:
желательно чтобы во время рисования этой линии бегала за курсором пока не произойдет событие MouseUp (как в паинте при рисовании линии)
вы разницу чувствуете между тем что я прошу и что советуете вы? то что советуете вы я и так с легкостью смогу сделать. но мне нужно чтобы было видно как эта линия будет выглядеть после MouseUp.

а за ссылку на алгоритм огромное спасибо
Никогда и ничего не просите! Никогда и ничего, и в особенности у тех, кто сильнее вас. Сами предложат и сами все дадут! © Булгаков
Danilka вне форума Ответить с цитированием
Старый 10.12.2010, 19:15   #7
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

как-то так:
Код:
var
  Draw: boolean;
  p1,p2: TPoint;
...
procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Draw:=true;
  p1:=Point(X, Y);
  p2:=p1;
  with Canvas do begin
    Pen.Color:=Color;
    Pen.Mode:=pmXor;
    MoveTo(p1.X, p1.Y);
    LineTo(p2.X, p2.Y);
  end;
end;

procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if not Draw then exit;
  with Canvas do begin
    MoveTo(p1.X, p1.Y);
    LineTo(p2.X, p2.Y);
    p2:=Point(X, Y);
    MoveTo(p1.X, p1.Y);
    LineTo(p2.X, p2.Y);
  end;
end;

procedure TForm2.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Draw:=false;
  with Canvas do begin
    MoveTo(p1.X, p1.Y);
    LineTo(p2.X, p2.Y);
    Pen.Color:=clBlack;
    Pen.Mode:=pmCopy;
    MoveTo(p1.X, p1.Y);
    LineTo(X, Y);
  end;
end;
x128 вне форума Ответить с цитированием
Старый 10.12.2010, 20:03   #8
Danilka
Пользователь
 
Аватар для Danilka
 
Регистрация: 30.03.2010
Сообщений: 28
По умолчанию

x128, спасибо. но это немного не то
Никогда и ничего не просите! Никогда и ничего, и в особенности у тех, кто сильнее вас. Сами предложат и сами все дадут! © Булгаков
Danilka вне форума Ответить с цитированием
Старый 10.12.2010, 20:46   #9
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Заменить в предыдущем коде в OnMouseMove:
Код:
  if not Draw then exit;
  Refresh;
  with Canvas do begin
    MoveTo(p1.X, p1.Y);
    LineTo((p2.X+p1.X)div 2 , p1.Y);
    LineTo((p2.X+p1.X)div 2 , p2.Y);
    LineTo(p2.X, p2.Y);
    p2:=Point(X,Y);
  end;
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 10.12.2010, 22:57   #10
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Вот почти самый примитивный вариант
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  Tf3p=array [0..2] of byte;
  Pf3p=^Tf3p;

var
  Form1: TForm1;
  MDown:Boolean;
  StartXY,EndXY:TPoint;
  Fillings:TRect;
  aBMP,ebmp:TBitmap;
  f3p,f3p2:Pf3p;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Fillings.Left:=0;
  Fillings.Top:=0;
  Fillings.Right:=Form1.Width;
  Fillings.Bottom:=Form1.Height;
  aBMP:=TBitmap.Create;
  ebmp:=TBitmap.Create;
  abmp.PixelFormat:=pf24bit;
  ebmp.PixelFormat:=pf24bit;
  aBmp.Width:=Form1.Width;
  aBMp.Height:=Form1.Height;
  eBmp.Width:=Form1.Width;
  eBMp.Height:=Form1.Height;
  eBMP.Canvas.Brush.Color:=Form1.Color;
  eBMP.Canvas.FillRect(Fillings);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MDown:=true;
  StartXY.X:=X;
  StartXY.Y:=Y;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
Var
  i,j:Integer;
begin
  aBMP.Canvas.MoveTo(StartXY.X,StartXY.Y);
  if MDown then
  begin
    aBMP.Canvas.Brush.Color:=Form1.Color;
    aBMP.Canvas.FillRect(Fillings);
    aBMP.Canvas.Brush.Color:=clBlack;
    aBMP.Canvas.LineTo(X,Y);
    for i:=0 to pred(ebmp.Height) do
    begin
      f3p:=ebmp.ScanLine[i];
      f3p2:=abmp.ScanLine[i];
      for j:=0 to pred(ebmp.Width) do
      begin
        if f3p^[0]=0 then
        begin
          f3p2[0]:=0;
          f3p2[1]:=0;
          f3p2[2]:=0;
        end;
        if j<pred(ebmp.Width) then
        begin
          inc(f3p);
          inc(f3p2);
        end;
      end;
    end;
    Form1.Canvas.CopyRect(Fillings,abmp.Canvas,Fillings);
  end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
i,j:Integer;
begin
  MDown:=false;
  for i:=0 to pred(ebmp.Height) do
  begin
    f3p:=ebmp.ScanLine[i];
    f3p2:=abmp.ScanLine[i];
    for j:=0 to pred(ebmp.Width) do
    begin
      if f3p2^[0]=0 then
      begin
        f3p[0]:=0;
        f3p[1]:=0;
        f3p[2]:=0;
      end;
      if j<pred(ebmp.Width) then
      begin
        inc(f3p);
        inc(f3p2);
      end;
    end;
  end;
  Form1.Canvas.CopyRect(Fillings,ebmp.Canvas,Fillings);
end;


begin
  MDown:=false;
end.
Делает то что вам надо. Вам осталось только скопировать и вставить вместо вашего проекта всё это.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 10.12.2010 в 23:03.
ImmortalAlexSan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
боьшая линия waffe66 HTML и CSS 1 27.03.2010 19:22
Линия SheriffCat Microsoft Office Word 8 22.10.2009 19:20
Линия тренда maxic Microsoft Office Excel 0 15.09.2009 18:23
Линия на осях 4ifir01 Мультимедиа в Delphi 3 08.12.2008 17:24
Прямая линия serres Общие вопросы Delphi 1 04.11.2007 18:33