Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 413

/ вопрос закрыт /

Доброго дня, уважаемые эксперты.
Подскажите пожалуйста, на TImage нарисована окружность с известным центром и радиусом. Пытаюсь выявить. когда курсор выйдет за пределы окружности с помощью уравнения окружности, но когда курсор перемещаешь ровно по оси Y вниз, то уравнение не рассчитывается, а если перемещать по диагонали, то событие работает примерно на два радиуса от центра дальше. Подскажите пожалуйста как правильно реализовать формулу?

Приложение:
  1. procedure TForm1.imMouseMove(Sender: TObject; Shift: TShiftState; X,
  2. Y: Integer);
  3. var
  4. oX, oY: Integer;
  5. begin
  6. oX:=63;
  7. oY:=63;
  8. if (Sqr(X - (oX)) + Sqr(Y - (oY)) >
  9. (Sqr(14))
  10. begin
  11.  
  12. end;
  13. end;


Димон Вопрос закрыт (ответы не принимаются, мини-форум закрыт)

Вопрос задал: Димон (статус: Посетитель)
Вопрос отправлен: 18 апреля 2013, 07:34
Состояние вопроса: закрыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Разбираться в твоём коде не стал, ибо влом и проще написать свой с нуля. Ну дык вот:

procedure TMainForm.BoxPaint(Sender: TObject);
begin
  // отрисовка окружности/эллипса
  with Box do
    begin
      Canvas.Brush.Color:= clRed;
      Canvas.Ellipse(0, 0, Width - 1, Height - 1);
    end;
end;
 
procedure TMainForm.BoxMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  a, b: Single; // радиусы эллипса
  Condition: Single;
  Temp: string;
begin
  with StatusBar do
    begin
      Panels[0].Text:= IntToStr(X);
      Panels[1].Text:= IntToStr(Y);
 
      // условие нахождения точки внутри эллипса: x^2 / a^2 + y^2 / b^2 <= 1
 
      a:= Box.Width / 2;  // радиус по оси X
      b:= Box.Height / 2; // радиус по оси Y
      Condition:= Sqr(X - a) / Sqr(a) + Sqr(Y - b) / Sqr(b);
      // (X - a) и (Y - b) - потому что точка (0, 0) не в центре эллипса, а в углу формы
      Temp:= FloatToStrF(Condition, ffFixed, 15, 2);
 
      if Condition <= 1.0
        then Panels[2].Text:= 'Inside (' + Temp + ')'
        else Panels[2].Text:= 'Outside (' + Temp + ')';
    end;
end;


Проект прицепляю к ответу.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 18 апреля 2013, 09:14
Оценка за ответ: 5

Комментарий к оценке: Вопрос решен великолепно. Спасибо min@y™

Мини-форум вопроса

Всего сообщений: 0.

18 апреля 2013, 09:34: Вопрос закрыт (решение принял автор вопроса — Димон): Вопрос решен

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.03 сек.