Добрый день. На графике координат есть две две пересекающиеся окружности, мне нужно найти область пересечения и ее закрасить.Подскажите пожалуйста, возможно есть какие-то специальные методы нахождения области пересечения или алгоритмы.
В программе происходят такие этапы:
1. Рисуется график координат:
Код:
private: System::Void panel1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
g = panel1->CreateGraphics(); // создаем место для рисования
blackPen = gcnew Pen( Color::Black,3.0f );
Pen ^penCO = gcnew Pen(Color::Green, 5.F);
g->DrawLine(penCO, Point(330, -5000), Point(330, 5000));//ось у
g->DrawLine(penCO, Point(-5000, 200), Point(5000, 200));//ось х
/* g->TranslateTransform(3200, 200); // смещение начала координат (в пикселях)
g->RotateTransform(180.0F);
g->ScaleTransform(7.0F, 7.0F);*/
List<Point> p = gcnew List<Point>(); // список точек графика
Pen ^pen = gcnew Pen(Color::DarkRed,0.5F); // перо, для отрисовки графика
Pen ^gridPen = gcnew Pen(Color::DeepPink, 0.0001F); //перо для отрисовки координатной сетки
System::Drawing::Font ^fo = gcnew System::Drawing::Font(FontFamily::GenericSerif,3.F); //шрифт для выведения
// рисуем координатную сетку
int x = 0; //начальное значение координаты х. Постороение идет из указанной точки
int y = -100; // начальное значение координаты у. Пояснение см выше.
while (x <= 700) //конечное значение координаты х. Бесконечное количество линий нам не надо, ибо никакой памяти не хватит
{
x = x + 15; // шаг линий, параллельных оси ОУ
y = y + 15; //шаг линий, параллельных оси ОХ
g->DrawLine(gridPen, Point(x, -1000), Point(x, 1000)); // рисуем линии, параллельные оси ОУ
g->DrawLine(gridPen, Point(-700, y), Point(700, y)); //рисуем линии, параллельные оси ОХ
}
}
Потом по нажатию кнопки рисуется первая окружность:
Код:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
a=0;b=0;c=200;d=200;
circle ^B=gcnew circle();
rect = Rectangle(a,b,c,d);
panel1->Refresh();
g->DrawEllipse(blackPen, rect ); //1 параметр-ось х,2-у
}
Дальше по нажатию кнопки рисуется вторая окружность (+по еще рисуется окружность, в которую входят две раннее нарисованные окружности)
Код:
private: System::Void button8_Click(System::Object^ sender, System::EventArgs^ e) {
String ^s1;
s1 = textBox1->Text;
Int32 x1=Convert::ToInt32(s1);
String ^s2;
s2 = textBox2->Text;
Int32 x2=Convert::ToInt32(s2);
String ^s3;
s3 = textBox3->Text;
Int32 x3=Convert::ToInt32(s3);
x3*=2;
//a=0;b=0;c=200;d=200;
int a1=a+15;
int b1=b-30;
int d1=c-20;
this->textBox1->AppendText(b.ToString());
// g->DrawEllipse(blackPen, a,b, c, d);
Pen^ blackPen2 = gcnew Pen( Color::Green,3.0f );
g->DrawEllipse(blackPen2, a1,b1, d1, d1);
int new_a=0;int new_b=0;
int new_s=0;
if(a<a1&&b<=b1) //a1=a+10 b1=b+30; (15<a1<90)(b<b1<70)
{
new_a=a-16;
new_s=((a1+d1)-a)+50;
// new_s=((a1+d1)+(a1-a));
new_b=b-15;
}
else if(a>a1&&b>b1) // a1=a-35; b1=b-30; <a1<55
{
new_a=a1-16;
new_b=b1-17;
new_s=((a+d)-a1)+50;
}
else if(a<a1&&b>b1) //a+15; b-15
{
new_a=a1-25;
new_b=b1;
new_s=((a+d)-a1)+50;
}
Pen^ blackPen1 = gcnew Pen( Color::Blue,3.0f );
g->DrawEllipse(blackPen1, new_a,new_b, new_s, new_s);
if(a<a1&&b>b1)
{
//for(int i=)
g->DrawLine(blackPen1, a1,b, a1+d1, b1+d1);
}
// panel1->Refresh();
}
Как имея все это, можно найти область пересечения этих двух первых окружностей и зарисовать найденную область? Спасибо