Найти площадь пересечения квадрата и треугольника

Roman20

Всем привет!Есть Две пересекающиеся фигуры это квадрат и треугольник.В атачке приложил.Надо найти площадь их пересечения. Причем квадрат задан 2 вершинами.Площадь треугольника еще удалось найти, но вот что с остальным делать не пойму.Натолкните на мысль. Спасибо.
<b>var</b>
xa,ya,xb,yb,xc,yc:Integer;
a,b,c:******;
S,p:******;
 
<b>begin</b>
 
a:=sqrt((xb-xc)*(xb-xc)+(yb-yc)*(yb-yc));
b:=sqrt((xa-xc)*(xa-xc)+(ya-yc)*(ya-yc));
c:=sqrt((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb));
 
p:=(a+b+c)/<b>2</b>;
S:=sqrt(p*(p-a)*(p-b)*(p-c));
11 ответов

Roman20

Рисунок забыл


Roman20

P.S.возможно, можно сделать API-функцией CombineRgn() с параметром fnCombineMode=RGN_AND


Roman20

P.P.S.естественно, придется для начала перевести все координаты в INTEGER (допустим, умножив на 100 и после вычисления CombineRgn поделив на 100)


Roman20

Roman20,Здесь по-моему голая математика, по делфе здесь вопрос если только как-то в сторону регионов копать.


Roman20

Roman20,Уточняющий вопрос.А фигуры расположены так как показаны на рисунке?Или может быть другое пересечение?А может быть такое, что одна фигура полностью расположена в другой фигуре*


Roman20

можно попробовать "в лоб"..на белой канве изобрать одну фигуру с "красной" заливкойпотом, и использованием режима смешения цветов, вторую (с синей заливкой например)...поле где они пересекутся, будет цветом отличным от фона и цвета фигур...считаем колличество пикселей такого цвета.либо... если не ошибаюсь, есть дедушкин метод "монтекарло"...для фигур должна быть возможность посчитать, внутри ли точка...и случайным образом "бомбим" рисунок, и считаем колличество точек которые оказались на пересечении фигур...соотнеся общую "забомбленную" площадь, колличество итераци, и колличество "попаданий" можно судить о площади..это "примерный" метод... чем больше итераций - тем больше точностьможно потренировать мозг, и поизвращаться над всякими там "бегущими волнами" )


Roman20

Roman20,Уточняющий вопрос.А фигуры расположены так как показаны на рисунке?Или может быть другое пересечение?А может быть такое, что одна фигура полностью расположена в другой фигуре*
Да фигуры расположены именно так.Я в принципе нашел решение, но есть проблема я никак не могу додумать как вычислить две другие точки квадрата. Я написал код, но он рисует прямоугольник, из за того что точки 4 и 5 находятся на разных Y :(Как вычислить подскажите?


Roman20

<b>procedure</b> TForm2.BitBtn1Click(Sender: TObject);
<b>var</b>
x1,x2,y1,y2 : integer;
<b>begin</b>
Image1.Canvas.MoveTo(<b>30</b>,<b>3</b>); <i>// 1</i>
Image1.Canvas.LineTo(<b>260</b>,<b>10</b>);<i>// 1-2</i>
Image1.Canvas.LineTo(<b>100</b>,<b>100</b>);<i>//2-3</i>
Image1.Canvas.LineTo(<b>30</b>,<b>3</b>);<i>//3-1</i>

Image1.Canvas.MoveTo(<b>20</b>,<b>80</b>);<i>//4</i>
Image1.Canvas.LineTo(<b>200</b>,<b>120</b>);<i>//4-5</i>
<i>//ñåðåäèíà ïî X êâàäðàòà (20+200)/2=110</i>
<i>//ñåðåäèíà ïî Y êâàäðàòà (80+120)/2=100</i>

<i>//Image1.Canvas.MoveTo(110,100);</i>
<i>//Image1.Canvas.LineTo(110,30);</i>

<i>//Image1.Canvas.MoveTo(110,100);</i>
<i>//Image1.Canvas.LineTo(110,170);</i>


x1:=<b>20</b>;
y1:=<b>80</b>;
x2:=<b>200</b>;
y2:=<b>120</b>;

<b>while</b> x1<>x2 <b>do</b>
<b>begin</b>
inc(x1);
dec(x2);
dec(y1);
dec(y2);

<b>end</b>;

Edit1.Text:=inttostr(y1);
Edit2.Text:=inttostr(y2);

Image1.Canvas.MoveTo(<b>20</b>,<b>80</b>);
Image1.Canvas.LineTo(<b>110</b>,<b>30</b>);
Image1.Canvas.LineTo(<b>200</b>,<b>120</b>);
Image1.Canvas.LineTo(<b>110</b>,<b>170</b>);
Image1.Canvas.LineTo(<b>20</b>,<b>80</b>);


<b>end</b>;


Roman20

Все нашел)осинило так сказать :)


Roman20

Ну так поделись с народом решением. :)