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


Автор: Clasteruga 12.7.2011, 19:59
всем доброго времени суток.......опишу суть задания: двигаем мышкой по форме, если нажали Шифт то запоминается текущая позиция курсора, это будет координаты точки(вектора) 1, двигаем мышь дальше, отпустили Шифт, запомнили текущие координаты курсора, они будут являться координатами точки 2. Необходимо вычислить угол между этими двумя векторами и что бы мышка после этого могла ходить только под вычисленным углом.

Фиксацию координат и вычисление угла описал.....теперь не знаю как сделать что бы эта самая мышь двигалась только под определенным углом.....знаю что необходимо использовать SetCursorPos.....только вот не знаю как описать параметры внутри этой функции так что бы мышь двигались под углом ??? 

Автор: northener 12.7.2011, 21:32
Цитата(Clasteruga @  12.7.2011,  19:59 Найти цитируемый пост)
Необходимо вычислить угол между этими двумя векторами и что бы мышка после этого могла ходить только под вычисленным углом.

Т.е. понимать нужно так, что после отпускания Шифт и вычисления угла мышь вообще никогда нельзя было бы передвинуть не "под этим углом"?

Автор: Clasteruga 12.7.2011, 22:05
за исключением если пользователь укажет новые точки

Автор: northener 12.7.2011, 22:29
Я это спросил к тому, что так как описан алгоритм в топике, то мышь после отпускания Шифт должна будет ходить не столько "под определенным углом", сколько "только по той прямой", которой принадлежат те две точки. 

Автор: Clasteruga 12.7.2011, 22:40
ну в принципе да, только она может не только по одной линии а как показано на рисунке 2, там угол 45*, и мышь может ходить получается в левый верхний угол, в правый верхний угол, в нижний и т.д

Автор: northener 13.7.2011, 00:28
Цитата(Clasteruga @  12.7.2011,  22:40 Найти цитируемый пост)
ну в принципе да,

Ну в принципе понял.
Понял что сама задача мне абсолютно не понятна.
Ну да. Угол вычИслили. А дальше то что? 
  1. Нужно отслеживать перемещение мыши пользователем? И помещать курсор в каждый момент перемещения в ту точку, которая наиболее близка к одному из четырёх отрезков исходящих из точки 2? И при новом нажатии на Шифт задавать новый угол возможного перемещения?
  2. Автоматически перемещать курсор по одному из этих четырех отрезков?

P.S. Если это "задание", то лучше не "описывать суть" задания, а приводить задание именно в том виде, в котором оно было задано.

Автор: Clasteruga 13.7.2011, 08:16
1. Да
2. Пользователь сам двигает мышью, но она может перемещаться только по этим отрезкам, на любое расстояние

Автор: Clasteruga 14.7.2011, 08:56
вот есть кое какие наработки только после того как поставил 2 точку и начинаю двигать мышью она начинает мерцать сильно и судня по все получать сразу 2 координаты 

Код

 Form1: TForm1;

cX,cY,pX,pY,cX2,cY2,Ugol:Integer;
bPoint, bLine : boolean;
Angle : Integer; //Угол, под катоым пересекаются прямые

implementation

{$R *.dfm}

function PosFromAngle(cX, cY : Integer; rLen : cardinal; Angle: Extended): TPoint;
begin
//Координаты точки лежащей на окружности, радиусом rLen
//с центром cX,cY и углом Angle
  Result.X:= cX+Round(rLen*Cos(DegToRad(Angle)));
  Result.Y:= cY+Round(rLen*Sin(DegToRad(Angle)));
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if Button = mbLeft then
  begin
   Cx := X;
   Cy := Y;
   bPoint := false;
   Label1.Caption := 'Точка 1 : X = '+inttostr(cx)+' Y = '+inttostr(cy);
   Form1.Canvas.Pixels[Cx,cY]:=ClBlack;
  end;
    if button = mbRight then
      begin
        Cx2 := X;
        Cy2 := Y;
        Label2.Caption := 'Точка 2: X = '+inttostr(cx2)+' Y = '+inttostr(cy2);
        bPoint := true;
        Form1.Canvas.Pixels[cX2,cY2]:=ClBlack;
        Ugol := Round (180*arctan2(cY2-cY,cX2-cX)/pi);
        Label3.Caption := 'Угол = ' + inttostr(ugol);
      end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var Pos:TPoint;
  begin
    Edit1.Text := 'X = '+inttostr(x);
    Edit2.Text := 'Y = '+inttostr(y);
         if bPoint then
        begin
         //cX,cY, - координаты центра
        //cx2,cy2 - координаты 2 точки
        //pX,pY - предыдущие координаты
          //If (X = pX) and (Y = pY) then exit; //Если перемещения не было - выходим.
          If (X > cX2) and (Y > cY2) then Angle := Ugol else
          If (X > cX2) and (Y < cY2) then Angle := Ugol + 90 else
          If (X < cX2) and (Y < cY2) then Angle := Ugol + 180 else
          If (X < cX2) and (Y > cY2) then Angle := Ugol + 270 ;
           Pos := PosFromAngle(cX2, cY2, Round (sqrt(sqr(cX2 - X) + sqr (cY2 - Y))), Angle);
           SetCursorPos(ClientOrigin.X + pos.X, ClientOrigin.Y + pos.Y);
           Form1.Canvas.Pixels[X,Y]:=clBlack;
           abort;
           //pX := X;
           //pY := Y;
       end;
      end;

procedure TForm1.FormResize(Sender: TObject);
begin
 bPoint := false;
end;

end.

Автор: northener 15.7.2011, 00:37
Так тебе ещё и рисовать нужно?!


Автор: northener 15.7.2011, 01:37
Кстати. Никаких "Шифтов" в представленном коде не нашел. :(

Цитата(Clasteruga @  14.7.2011,  08:56 Найти цитируемый пост)
вот есть кое какие наработки

Откуда нарыл?

Автор: Clasteruga 19.7.2011, 13:39
Цитата(northener @ 15.7.2011,  01:37)
Кстати. Никаких "Шифтов" в представленном коде не нашел. :(

Цитата(Clasteruga @  14.7.2011,  08:56 Найти цитируемый пост)
вот есть кое какие наработки

Откуда нарыл?

Не рисовать не надо это я так сделал что бы было видно как движется мышь .....Немного помогли.......с шифтом я разберусь......он есть но я его не вставлял решил пока с мышкой сделать....можете подсказать в чем проблемка????? почему курсор мерцает и двигается сразу в 2-х направлениях?

Автор: northener 20.7.2011, 00:57
Цитата(Clasteruga @  19.7.2011,  13:39 Найти цитируемый пост)
Не рисовать не надо это я так сделал что бы было видно как движется мышь .....Немного помогли.......с шифтом я разберусь......он есть но я его не вставлял решил пока с мышкой сделать....можете подсказать в чем проблемка????? почему курсор мерцает и двигается сразу в 2-х направлениях?

Задачу озвучь. И плюнь на "некоторые наработки".

Автор: Clasteruga 20.7.2011, 09:11
необходимы рассчитать угол между 2-мя векторами и после этого когда пользователь двигает мышкой она должна двигаться только под этим углом в 4-х направлениях смотри рисунок ниже................

Автор: northener 21.7.2011, 00:31
Цитата(Clasteruga @  20.7.2011,  09:11 Найти цитируемый пост)
необходимы рассчитать угол между 2-мя векторами и после этого когда пользователь двигает мышкой она должна двигаться только под этим углом в 4-х направлениях смотри рисунок ниже................


Я же просил описать задачу! Реальную задачу, а не теоретический вопрос!

P.S. Рисунок ниже мало помогает понять суть задачи.

Автор: Clasteruga 21.7.2011, 09:08
 smile  задача в том и состоит что бы мышь двигалась по форме только под вычисленным углом...... в 4-х направлениях как на рисунке относительно вектора 1.....красными линиями показано как может двигаться мышь после того как был вычислен угол  

Автор: Clasteruga 21.7.2011, 15:59
скину исходник может так проще будет

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