Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
6-1165052858
__fastcall;
2006-12-02 12:47
2007.06.24
wsocket / wsocket2 - recv


2-1180679385
сирх
2007-06-01 10:29
2007.06.24
немогу разобраться с мемо


15-1180434701
Dmitriy O..
2007-05-29 14:31
2007.06.24
Желающим совместно со мной разрабатывать перспективный проект


2-1180686571
KyRo
2007-06-01 12:29
2007.06.24
Частота дискредитации


2-1180626487
FIL-23
2007-05-31 19:48
2007.06.24
округление





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский