forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Сенсоры и прямая линия. (http://forum.boolean.name/showthread.php?t=14120)

Gector 27.01.2011 18:02

Сенсоры и прямая линия.
 
Написал функцию отрисовки линии с помощью сенсора. По задумке она должна точно рисовать линию на подобие пейнтовской. Тоесть как бы "царапать" экран).
Но иногда она работает не корректно. А именно: с самого начала рисует линию из начала координат и принимает координаты конца предыдущей линии за начало новой линии. Исчезать она должна - это не баг.
Код:

program line;
uses sensor;

var x, y, xline, yline, pointer_x, pointer_y, first_pointer_x, first_pointer_y, pointer_time, pe: integer;
    keyCode: integer;
begin
    sensor.init;
  repeat
    SetColor(255, 255, 255);
    FillRect(0, 0, GetWidth, GetHeight);
    SetColor(0, 0, 0);
    keyCode:= GetKeyPressed;
        pe:=pointer_state;   
        pointer_x:=pointer_dragged_x;
        pointer_y:=pointer_dragged_y;
 
        If pe>0 then begin
            DrawLine(first_pointer_x,first_pointer_y,pointer_x,pointer_y);
            DrawText('+',pointer_x,pointer_y);
            if pointer_time=0 then begin
                first_pointer_x:= pointer_dragged_x;
                first_pointer_y:= pointer_dragged_y;   
            end;
            if pointer_time>0 then begin
                pointer_x:= pointer_dragged_x;
                pointer_y:= pointer_dragged_y;   
            end;
            pointer_time:=pointer_time+1;
        end;
        if pe=0 then begin
                pointer_time:=0;
                first_pointer_x:= pointer_x;
                first_pointer_y:= pointer_y;
        end;
    Repaint;
  until (keyCode = KE_KEY0) or (KeyToAction(keyCode) = GA_FIRE);
end.


Gector 27.01.2011 20:29

Ответ: Сенсоры и прямая линия.
 
Проблема решена.
Код:
Код:

program line;
uses sensor;

var x, y, xline, yline, pointer_x, pointer_y, first_pointer_x, first_pointer_y, pointer_time, pe: integer;
    keyCode: integer;
begin
    sensor.init;
  repeat
        SetColor(255, 255, 255);
    FillRect(0, 0, GetWidth, GetHeight);
    SetColor(0, 0, 0);
    keyCode:= GetKeyPressed;
        pe:=pointer_state;   
        DrawText(IntegerToString(pe),0,0);
        DrawText(IntegerToString(pointer_time),0,20);
        If pe>0 then begin
            //if has_pointer_motion_events=1 then begin
                    first_pointer_x:=pointer_pressed_x;
                    first_pointer_y:=pointer_pressed_y;
                    //pointer_x:= pointer_released_x;
                    //pointer_y:= pointer_released_y;
                    pointer_x:=pointer_dragged_x;
                    pointer_y:=pointer_dragged_y;
            //end;
            DrawLine(first_pointer_x,first_pointer_y,pointer_x,pointer_y);
            DrawText('+',pointer_x,pointer_y);
           
        end;

    Repaint;
  until (keyCode = KE_KEY0) or (KeyToAction(keyCode) = GA_FIRE);
end.

З.Ы. Хорошая тенденция: пишу и ожидая ответа допираю до решения сам:-D...

aNNiMON 28.01.2011 02:36

Ответ: Сенсоры и прямая линия.
 
А так всегда, пока всё держишь в голове, ничего не понимаешь, а как-только начинаешь излагать суть проблемы, то мысли выравниваются и всё становится понятным :)


Часовой пояс GMT +4, время: 20:01.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot