Форум: "Начинающим";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];
ВнизВозник вопрос по Delphi Найти похожие ветки
← →
Александр_Н (2007-05-29 05:50) [0]Здравствуйте. Суть проблемы в следующем:
На форме (в произвольном месте)находится круг. При каждом щелчке мыши на свободной части формы должен образовываться новый круг, причём место клика/щелчка = центр нового круга; круг должен соприкасаться, по касательной, с ближайшей к нему кругом.
Задача сводится к следующему. Есть множество кругов,
описываемых координатами центра и радиусом. Для произвольной точки нужно:
1. Вычислить рсстояние от этой точки до центра каждого круга.
2. Из этого расстояния вычесть радиус соответствующего круга.
3. Из полученных разностей выбрать минимальную.
4. Построить круг с центром в заданной точке и радиусом равным
минимальному расстоянию из п.3.
Подскажите, пожалуйста, как реализовать всё это на практике, каков будет код?
С уважением Александр.
← →
X9 © (2007-05-29 06:04) [1]Задавайте конкретные вопросы, что именно у вас не получается.
Несмотря на обилие альтруистов на дааном форуме, с большой степенью вероятности, могу заявить, что никто не будет писать за вас программу целиком (бесплатно).
← →
TUser © (2007-05-29 06:07) [2]> 1. Вычислить рсстояние от этой точки до центра каждого круга.
Если именно это считается расстоянием до круга, а не расстояние до центра минус радиус.
← →
homm © (2007-05-29 10:09) [3]> На форме (в произвольном месте)находится круг.
Ворма — компонент приложения. Круг — геомнтрическая фигура. Она не может находиться на форме.
← →
palva © (2007-05-29 12:48) [4]homm © (29.05.07 10:09) [3]
> Круг — геомнтрическая фигура. Она не может находиться на форме.
Ну, раз автор написал, что находится, значит у него круг является компонентой. То ли это TShape, в котором Shape=stCircle, то ли его собственная неизвестная нам компонента. Но он об этом не рассказывает.
← →
Углук © (2007-05-29 15:34) [5][quote]При каждом щелчке мыши на свободной части формы должен образовываться новый круг, причём место клика/щелчка = центр нового круга; круг должен соприкасаться, по касательной, с ближайшей к нему кругом.[/quote]
Я увидел противоречие :если место клика/щелчка=центр нового круга, то ближайший круг может быть расположен так, что коснуться "по касательной" новый круг его никак не сможет.
Если же эти оба условия все же должны соблюдаться одновременно, тогда центры всех кругов будут фиксированными точками, расположение которых будет зависеть от фиксированного радиуса всех кругов. Если же радиусы кругов могут быть разными, тогда задача сводится с расчету "валидных" точек, кои могут стать центрами новых кругов, с учетом радиуса этих новых кругов. Но тогда новый центр круга не станет "произвольным местом", а останется одним из мест, включенных в множество новых центров кругов. Задача полна противоречий. Переформулируйте условие или упомяните об ограничениях.
← →
Однокамушкин (2007-05-29 15:39) [6]
> если место клика/щелчка=центр нового круга, то ближайший
> круг может быть расположен так, что коснуться "по касательной"
> новый круг его никак не сможет.
Это как это не сможет? Сможет в любом случае, за исключеним того, когда новая точка совпадает с центром старого круга...
← →
Barloggg (2007-05-29 16:45) [7]блин, но это же так просто.
при каждом щелчке ищем минимальное "расстояние до центра минус его радиус".
и минимальный из этого есть искомый радиус нового круга.
и всего делов.
справедливо даже для случая когда нет вложенных кругов. только искать надо по модулю.
ЫЫЫЫЫ...
прочитал то что написал, а потом прочитал первый пост.
ндя.
автор хочет код?
ну-ну. Это слишком просто.
нужно иметь список центров кругов
var c:array of Tpoint
← →
iXT © (2007-05-29 16:53) [8]> автор хочет код?
Убитых в студию :)
← →
Углук © (2007-05-29 18:46) [9]
> как это не сможет? Сможет в любом случае, за исключеним
> того, когда новая точка совпадает с центром старого круга.
А если расстояние до ближайшего круга меньше, чем радиус нового круга?
← →
Плохиш © (2007-05-29 18:50) [10]
> Углук © (29.05.07 18:46) [9]
> А если расстояние до ближайшего круга меньше, чем радиус
> нового круга?
Вообще-то в задании радиус нового круга не задаётся, а расчитывается...
← →
Углук © (2007-05-30 11:45) [11]
> ообще-то в задании радиус нового круга не задаётся, а расчитывается.
> ..
Где вы это увидели, прошу указать мне
← →
Плохиш © (2007-05-30 11:47) [12]
> Углук © (30.05.07 11:45) [11]
Читай в [0]
CODE>
1. Вычислить рсстояние от этой точки до центра каждого круга.
2. Из этого расстояния вычесть радиус соответствующего круга.
3. Из полученных разностей выбрать минимальную.
4. Построить круг с центром в заданной точке и радиусом равным
минимальному расстоянию из п.3.
← →
Правильный Вася (2007-05-30 12:18) [13]типичная лаба для первого курса
халявщиков - в стройбат!
← →
Углук © (2007-05-30 12:20) [14]Плохиш © (30.05.07 11:47) [12]
Увидел, прошу извинить за тупость
← →
Углук © (2007-05-30 12:47) [15]Что-то набросал.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type TCircle= record
X,Y,radius:Integer;
end;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
var
C:array [1..1000] of TCircle;
p: integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
p:=1;
c[1].X:=200;
c[1].Y:=200;
c[1].radius:=10;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var i,j:integer;
r:integer;
begin
j:=1;
r:=Trunc(sqrt(sqr(X-C[1].x)+sqr(Y-C[1].y)));
for i:= 1 to p
do begin
if Trunc(sqrt(sqr(X-C[i].x)+sqr(Y-C[i].y)))<r then
begin
r:=Trunc(sqrt(sqr(X-C[i].x)+sqr(Y-C[i].y)));
j:=i;
end;
end;
inc(p);
C[p].X:=X;
C[p].Y:=Y;
C[p].radius:=r-C[j].radius;
Canvas.Ellipse(c[p].X-c[p].Radius,c[p].Y-c[p].Radius,c[p].X+c[p].Radius,c[p].Y+c[p].Radius);
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Ellipse(c[1].X-c[1].Radius,c[1].Y-c[1].Radius,c[1].X+c[1].Radius,c[1].Y+c[1].Radius);
end;
end.
т.е. ближайший хоть и "по касательной" дотрагивается , но другие круги
частично перекрываются ; то есть то что я писал в [1], хоть и неверно, но все же полной красоты достичь не удалось. Может, у кого лучше получится?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.046 c