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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2017, 10:56   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.DrawAngle(x,y,radius: Integer; angle: real);
begin
  Canvas.MoveTo(x,y);
  Canvas.Ellipse(x-radius,y-radius,x+radius,y+radius);
  Canvas.LineTo(Round(x + Cos(angle)*radius),Round(y + Sin(angle)*radius));
end;
Цитата:
x0,y0 - искомая точка?
Yes it is
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.10.2017, 11:37   #12
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

если искомая точка находится левее или выше начальной, тогда линия рисуется в противоположном направлении.
BLACK_RAIN вне форума Ответить с цитированием
Старый 31.10.2017, 12:00   #13
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А, ось y вниз. Сделай так:
Код:
  angle:=ArcTan((y0-y)/(x0-x));
  if x0<x then angle:=angle+pi;
  DrawAngle(x,y,r,angle);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.10.2017, 12:54   #14
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Спасибо. Вопрос решен.
Специально для таких одарённых как я, выкладываю код:
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure DrawAngle(x,y,radius: Integer; angle: real);
    procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  xCenter,yCenter : Integer; // начальная точка
  r : Integer; // радиус окружности
  DestPt : TPoint; // искомая точка

implementation

{$R *.dfm}

function Point(const X,Y : Integer) : TPoint;
begin
  Result.X := x;
  Result.Y := y;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WindowState := wsMaximized;
  r := 100; //радиус
  DestPt := Point(0,0);
  Timer1.Interval := 10;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Timer1.Enabled := False;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Close;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then
  begin
    xCenter := x;
    yCenter := y;
  end else
  DestPt := Point(x,y);
end;

procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  if r > 54 then
  Dec(r,5);
end;

procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  inc(r,5);
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  a : Real;
begin
  Canvas.FillRect(ClientRect);
  if (DestPt.X <> xCenter) and (DestPt.Y <> yCenter) then
  begin
    a := ArcTan((DestPt.y - yCenter)/(DestPt.X - xCenter));
    if DestPt.X < xCenter then
    a := a+pi;
    DrawAngle(xCenter,yCenter, r, a);
  end;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  xCenter := Width div 2 - 10;
  yCenter := Height div 2 - 18;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Invalidate;
end;

procedure TForm1.DrawAngle(x,y,radius: Integer; angle: real);
begin
  Canvas.MoveTo(x,y);
  Canvas.Ellipse(x-radius,y-radius,x+radius,y+radius);
  Canvas.LineTo(Round(x + cos(angle)*radius),Round(y + Sin(angle)*radius));
end;

end.
Можно обойтись без таймера, если не нужен. Для этого, в событии OnMouseMove() вызываем Invalidate; или процедуру рисования.
BLACK_RAIN вне форума Ответить с цитированием
Старый 31.10.2017, 13:18   #15
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А еще лучше и правильней рисовать в PaintBox и ни каких таймеров не нужно ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.10.2017, 13:21   #16
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А еще лучше и правильней рисовать в PaintBox и ни каких таймеров не нужно ))
я вообще форму и компоненты использую только для тестов
BLACK_RAIN вне форума Ответить с цитированием
Старый 01.11.2017, 09:15   #17
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Я дико извиняюсь, но вопрос решен не до конца
Цитата:
Сообщение от Аватар Посмотреть сообщение
Сделай так:
Код:
  angle:=ArcTan((y0-y)/(x0-x));
  if x0<x then angle:=angle+pi;
  DrawAngle(x,y,r,angle);
Линия рисуется правильно. Но как узнать, под каким углом она нарисована? всмысле градус этого угла

Последний раз редактировалось BLACK_RAIN; 01.11.2017 в 09:20.
BLACK_RAIN вне форума Ответить с цитированием
Старый 01.11.2017, 09:49   #18
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
всмысле градус этого угла
так у Вас же angle и содержит величину угла.
В радианах.
Не знаете, как радианы перевести в градусы?
Тогда просто воспользуйтесь встроенной функцией Delphi: RadToDeg()
(или можете умножить величину угла в радианах на 180° и разделите на pi - получите угол в градусах)

например,
Код:
  angle:=ArcTan((y0-y)/(x0-x));
  if x0<x then angle:=angle+pi;
  ShowMessage(' величина угла в градусах = ' + FloatToStr( RadToDeg( angle)) );
  DrawAngle(x,y,r,angle);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.11.2017, 10:41   #19
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Код:
procedure TForm1.FormPaint(Sender: TObject);
var
  a : Real;
begin
  Canvas.FillRect(ClientRect);
  if (DestPt.X <> xCenter) and (DestPt.Y <> yCenter) then
  begin
    a := ArcTan((DestPt.y - yCenter)/(DestPt.X - xCenter));
    if DestPt.X < xCenter then
    a := a+pi;
    DrawAngle(xCenter,yCenter, r, a);
    lbl1.Caption := FormatFloat('0.00', (a*180)/pi));
  end;
end;
В диапазоне, где должно быть 270 - 359.99, выдаёт -90.0 - -0.01
Где ошибка?

Последний раз редактировалось BLACK_RAIN; 01.11.2017 в 10:52.
BLACK_RAIN вне форума Ответить с цитированием
Старый 01.11.2017, 11:03   #20
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Та нет ошибки. Просто формулы рассчитаны на правильную систему координат, а у тебя ось oy вниз направлена. Преобразуй так:
Код:
  if a<0 then a:=a+2*pi;
  a:=2*pi-a;
  lbl1.Caption:=FormatFloat('0.00',a*180/pi);
Можно было бы и заранее угол корректно вычислять, но тогда при отображении пришлось бы зеркальные преобразования делать с координатой y
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 01.11.2017 в 11:07.
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить взаимное расположение точки с координатами (x_0,y_0) и окружности радиуса R с центром в точке (x_1,y_1). С# :) OlgaRostov C# (си шарп) 3 24.09.2015 20:26
Нарисовать линию на картинке spirit-ua PHP 13 02.07.2015 09:30
Найти взаимное расположение окружности радиуса R с центром в точке (x0, y0) и точки А с координатами (x1, y1). Dimazde Паскаль, Turbo Pascal, PascalABC.NET 1 10.12.2013 08:58
Нужно изменить на языке C++ Найти такую точку, что шар радиуса R с центром в этой точке, содержит min число точек заданного мн-ва. Alexandr95 Помощь студентам 0 26.05.2013 19:55