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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2010, 19:13   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Draw Line проблемы алгоритма

Взял из вики готовый алгоритм. На первый взгляд работает. Но если делать линию X, Y, - X+1, Y+1, то рисуется только одна точка.
Код:
Procedure FVFL_DrawLine(Handle: HBITMAP; X1, Y1, X2, Y2, Color : Integer);
Var
 BMP: BITMAP;
 Ar: Array Of Array Of PRGBTriple;
 P1, P2: PRGBTriple;
 X, Y   : Integer;
 DX, DY : Integer;
 SX, SY : Integer;
 Check  : Integer;
 E      : Integer;
 R,G,B  : Byte;
 I      : Integer;
Begin
 Windows.GetObject(Handle, SizeOf(Bmp), @BMP);
 SetLength(Ar, BMP.bmWidth, BMP.bmHeight);
 P1 := BMP.bmBits;
 If BMP.bmBitsPixel = 24 Then
   Begin
      For Y := 0 To BMP.bmHeight - 1 Do
        Begin
          P2 := P1;
            For X := 0 To BMP.bmWidth - 1 Do
              Begin
                Ar[X,Y]:=P2;
                Inc(P2);
              End;
              Pointer(P1) := Pointer(Integer(P1) + BMP.bmWidthBytes);
        End;
      R := (Color And $0000FF);
      G := (Color And $00FF00) Shr 8;
      B := (Color And $FF0000) Shr 16;

      DX := Abs(X1 - X2);
      DY := Abs(Y1 - Y2);
      If X2 - X1 < 0 Then SX := -1 Else
      If X2 - X1 = 0 Then SX := 0 Else
      If X2 - X1 > 0 Then SX := +1;
      If Y2 - Y1 < 0 Then SY := -1 Else
      If Y2 - Y1 = 0 Then SY := 0 Else
      If Y2 - Y1 > 0 Then SY := +1;
      X := X1;
      Y := Y1;
      Check := 0;
      If DY > DX Then
       Begin
        DX := DX + DY;
        DY := DX - DY;
        DX := DX - DY;
        Check := 1;
       End;
      E := 2 * DY - DX;
      For I := 1 To dx Do
       Begin
        Ar[X, Y].rgbtBlue  := B;
        Ar[X, Y].rgbtGreen := G;
        Ar[X, Y].rgbtred   := R;
        If E >= 0 Then
         Begin
          If Check = 1 Then X := X + SX
                       Else Y := Y + SY;
          E := E - 2 * DX;
         End;
        If Check = 1 Then Y := Y + SY
                     Else X := X + SX;
        E := E + 2 * DY;
      End;
  End
 Else
  MessageBox(0, 'Library error - 0x00', 'Error', MB_OK);
End;
Может у кого есть другой алгоритм?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 16.07.2010, 19:29   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Нашел фейл, исправил в вике и здесь нужно сделать так:
Код:
For I := 0 To dx Do
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
где можно скачать corel draw x4 Полный ноль Помощь студентам 2 24.02.2011 11:06
HBITMAP => DRAW Alex Cones Общие вопросы Delphi 18 08.05.2010 18:52
Рисование картинки методом Draw Nazar1994 Общие вопросы Delphi 2 21.11.2009 01:57
Работа для знающих corel draw Sanja Фриланс 2 22.10.2008 07:08
Corel Draw - рисунки после редактирования здорово увеличиваются Viteef Свободное общение 8 19.02.2008 09:16