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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2011, 16:18   #1
Claster
Форумчанин
 
Аватар для Claster
 
Регистрация: 02.09.2008
Сообщений: 340
По умолчанию Ближайшая точка к курсору

Все привет......известен центр и радиус, как узнать ближайшую точку к курсору в это радиусе?
Цитата:
- Только сисадмин может попросить у начальства 20$ на память...
Claster вне форума Ответить с цитированием
Старый 21.07.2011, 22:00   #2
D@rkD@iver
Форумчанин
 
Регистрация: 28.07.2009
Сообщений: 189
По умолчанию

по теореме пифагора!
с^2= (x1-x2)^2+(y1-y2)^2;
находишь минимальный c^2 это и будет искомая точка
пишу программы для студентов и школьников на Pascal, Delphi, C++, WINAPI, assembler
обучаю программированию на паскале(дистанционно);mail: hruslow@gmail.com
D@rkD@iver вне форума Ответить с цитированием
Старый 21.07.2011, 22:13   #3
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Как то так ...
Код:
var
 x0,y0,r,x1,y1,x,y,alfa:real;
begin
 write('Центр окружности: ');
 readln(x0,y0);
 write('Радиус окружности: ');
 readln(r);
 write('Координаты точки: ');
 readln(x1,y1);
 if x1<>x0
  then alfa:=arctan((y1-y0)/(x1-x0))
  else if y1<y0
           then alfa:=-pi/2
           else alfa:=pi/2;
 x:=cos(alfa)*r;
 y:=sin(alfa)*r;
 if x1<x0 then begin x:=-x; y:=-y end;
 x:=x+x0; y:=y+y0;
 writeln('x=',x:5:2,'  y=',y:5:2);
 readln
end.
на неконкретные вопросы даю неконкретные ответы ...

Последний раз редактировалось Step_UA; 22.07.2011 в 19:29.
Step_UA вне форума Ответить с цитированием
Старый 22.07.2011, 15:54   #4
Claster
Форумчанин
 
Аватар для Claster
 
Регистрация: 02.09.2008
Сообщений: 340
По умолчанию

Перенес все на компоненты.............вопрос а как узнать ближайшую точку в области радиуса?

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  rad := Round (sqrt(sqr(x1 - x0) + sqr (y1 - y0)));
  label3.Caption := 'Радиус = ' + inttostr(rad);
  if x1<>x0
  then alfa:=Round(arctan((y1-y0)/(x1-x0)))
  else if y1<y0
           then alfa:=Round(-pi/2)
           else alfa:=Round(pi/2);
 x2:=Round(cos(alfa)*rad+x0);
 y2:=Round(sin(alfa)*rad+y0);
 if x1<x0 then begin x2:=-x2; y2:=-y2 end;
 Label4.Caption := 'Ближайшая точка X = '+inttostr(x2) + ' Y = ' + inttostr(y2);
 Form1.Canvas.Pixels[x2,y2]:=clBlack;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then begin
    x0 := x;
    y0 := y;
    label1.Caption := 'Центр: X = '+inttostr(x0)+' Y = ' +inttostr(y0);
    Form1.Canvas.Pixels[x0,y0]:=clBlack;
  end;

  if Button = mbRight then begin
    x1 := x;
    y1 := y;
    label2.Caption := 'Точка 2: X = '+inttostr(x1)+' Y = ' +inttostr(y1);
    Form1.Canvas.Pixels[x1,y1]:=clBlack;
  end;
end;
Цитата:
- Только сисадмин может попросить у начальства 20$ на память...
Claster вне форума Ответить с цитированием
Старый 22.07.2011, 19:35   #5
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

если вы под выражением "в области радиуса" подразумеваете точку на окружности, то изначально все так и было ... x0,y0 - центр круга; x1,y1 - любая точка; r - радиус; x,y-ближайшая точка на окружности
ЗЫ немного подправил код
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 22.07.2011, 23:54   #6
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,815
По умолчанию

Вам надо в цикле перебрать все известные точки, сравнивая расстояние от них до центра. А самое минимальное значение нужно запомнить. вот и всё.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 26.07.2011, 10:17   #7
Claster
Форумчанин
 
Аватар для Claster
 
Регистрация: 02.09.2008
Сообщений: 340
По умолчанию

Код:
for i := 0 to x2 do
  for j := 0 to y2 do
    begin

    //Условие отбора

      end;

    end;
В таком цикле??
Цитата:
- Только сисадмин может попросить у начальства 20$ на память...
Claster вне форума Ответить с цитированием
Старый 26.07.2011, 14:50   #8
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,815
По умолчанию

допустим, r - радиус вашей окружности. одна из точек - это конец курсора с точками xc:=Mouse.CursorPos.X и yc:=Mouse.CursorPos.Y. а остальные точки вокруг курсора могут быть у вас в массиве pixX[i] и pixY[i], где i=1..100, скажем так.
вам нужно перебрать все значения по индексу i:
Код:
Rmin:=10000;//начальное значение минимального расстояния
for i:=1 to N do
begin
   R:=sqrt((xc-pixX)*(xc-pixX)+(yc-pixY)*(yc-pixY));//теорема Пифагора
   if(R<Rmin)and(R<=r)then
   begin 
      Rmin:=R;//новое минимальное значение расстояния до курсора от точки
      Imin:=i;//запоминаем номер ближайшёй точки;
   end;
end;
если R будет числом целым, то придётся результат округлить R:=Round(а тут ваш корень)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 26.07.2011 в 14:53.
NetSpace вне форума Ответить с цитированием
Старый 26.07.2011, 16:02   #9
Claster
Форумчанин
 
Аватар для Claster
 
Регистрация: 02.09.2008
Сообщений: 340
По умолчанию

ок спасибо.......может подскажите еще почему курсор мерцает и как я понимаю получает сразу 2 координаты

Код:
var
  Form1: TForm1;
//cX,cY - координаты центра
//pX,pY - предыдущие координаты
cX,cY,pX,pY,cX2,cY2,Ugol,rLen,c:Integer;
Pos:TPoint;
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(Angle*pi/180));//DegToRad(Angle)
  Result.Y:= cY+Round(rLen*Sin(Angle*pi/180));//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);
  begin
    GetCursorPos(pos);
    Edit1.Text := 'X = '+inttostr(X);
    Edit2.Text := 'Y = '+inttostr(Y);
      if bPoint then
        begin
         while Ugol > 90 do
         Ugol := Ugol - 90;
         //cX,cY - координаты центра
        //pX,pY - предыдущие координаты
          If (X = pX) and (Y = pY) then exit; //Если перемещения не было - выходим.
          If (X > cX) and (Y > cY) then Angle := Ugol;
          If (X > cX) and (Y < cY) then Angle := Ugol + 90;
          If (X < cX) and (Y < cY) then Angle := Ugol + 180;
          If (X < cX) and (Y > cY) then Angle := Ugol + 270;

          rLen := Round (sqrt(sqr(cx - x) + sqr (cY - y)));
          Label5.Caption := 'rLen = ' + inttostr(rLen);

          Pos := PosFromAngle(cX, cY, rLen , Angle);

          px := pos.X;
          py := pos.Y;

          if (px <> cx2) and (py <> cy2) then
           begin
            Label6.Caption := 'Мышь двигается';
           end;
          //ClientOrigin положение начала клиентской области относитель*но экрана
          SetCursorPos(ClientOrigin.X + pos.X , ClientOrigin.Y + pos.Y);
          label4.Caption := 'Angle = ' + inttostr(angle);
          Form1.Canvas.Pixels[pos.X,pos.Y] := clBlack;
          abort;
          end;
      end;

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

end.
Вложения
Тип файла: rar Угол Моя.rar (222.5 Кб, 6 просмотров)
Цитата:
- Только сисадмин может попросить у начальства 20$ на память...
Claster вне форума Ответить с цитированием
Старый 27.07.2011, 16:03   #10
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,815
По умолчанию

Хм, мерцает, если щёлкнуть правой клавишей мышки, а левая всё мерцание вылечивает. причём рисуются координатные оси...
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
рисование линии противоположно курсору fate Общие вопросы Delphi 3 20.05.2011 22:42
Графика в TurboPascal: Процедуры, рисующие на экране смешанный лес (лес состоит из елей) по курсору GreenDay Помощь студентам 2 04.05.2011 13:31
Точка доступа SNUPY Компьютерное железо 9 18.02.2011 17:30
Ближайшая точка к заданной. Язык си MirandaX Помощь студентам 6 26.05.2009 18:25
Точка на полигоне? Роман Радер Общие вопросы Delphi 14 12.02.2007 17:08