Пересечение и объединение прямоугольников.

В начале программы

public:

Form1(void)

{

InitializeComponent();

ImageTime = 1;

Flag =1;

// ------------ ПРОРИСОВКА ТЕКСТА НАЧАЛО ------------------------------------

this->Size = System::Drawing::Size(330,300);

this->Text = L"Hello GDI+";

this->Padding = System::Windows::Forms::Padding(0);

this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;

// ------------ ПРОРИСОВКА ТЕКСТА КОНЕЦ ---------------------------------

// ------------ ПРОРИСОВКА ПРЯМОУГОЛЬНИКОВ НАЧАЛО -----------------------

Drawing::Point point1 = Drawing::Point(40,30);

Drawing::Point point2 = Drawing::Point(50,20);

Drawing::Size size = Drawing::Size(60, 50);

rect1 = Drawing::Rectangle(point1, size);

rect2 = Drawing::Rectangle(point2, size);

// ------------ ПРОРИСОВКА ПРЯМОУГОЛЬНИКОВ КОНЕЦ ------------------------

}

Drawing::Rectangle rect1;

Drawing::Rectangle rect2;

В Paint вставляем следующий кусочек

//------------- ЕДИНИЦЫ ИЗМЕРЕНИЯ КОНЕЦ -------------------------------------// ------------ ПРОРИСОВКА ПРЯМОУГОЛЬНИКОВ НАЧАЛО ---------------------------

e->Graphics->DrawRectangle(Pens::Black, rect1);

e->Graphics->DrawRectangle(Pens::Black, rect2);

// ------------ ПРОРИСОВКА ПРЯМОУГОЛЬНИКОВ КОНЕЦ ----------------------------

Заходим в конструктор и вызываем событие MouthDown. Ему соответствует код

private: System::Void Form1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)

{

// построение точки клика x,y

Point p = Point(e->X, e->Y);

// Мы нажали объединение ?

if (Rectangle::Intersect(rect1, rect2).Contains(p))

Text = "Объединение";

// Мы нажали пересечение ?

else if (Rectangle::Union(rect1, rect2).Contains(p))

Text = "Пересечение";

// Вне прямоугольников

else

Text = "Вне прямоугольников";

}

Можно создать игрушку – поймай пересечение. В Paint в прорисовке текста измените отрывок

// ------------ ПРОРИСОВКА ТЕКСТА НАЧАЛО --------------------------------

Graphics ^g = e->Graphics;

g->DrawString(Text,

gcnew Drawing::Font("Arial", 16), Brushes::Red, 75.0+ImageTime*2, 110.0+ImageTime);

// ------------ ПРОРИСОВКА ТЕКСТА КОНЕЦ ---------------------------------

Кроме того, в единицах измерения закомментируйте переход к иному масштабу.

//g->PageUnit = GraphicsUnit::Millimeter;

Запустите и посмотрите результат, щелкая мышкой в различных участках прямоугольников. Полный текст программы:

#pragma once

namespace MyPaintFirst {

using namespace System;

using namespace System::ComponentModel;

using namespace System::Collections;

using namespace System::Windows::Forms;

using namespace System::Data;

using namespace System::Drawing;

public ref class Form1 : public System::Windows::Forms::Form

{

public: int ImageTime;

int Flag;

public:

Form1(void)

{

InitializeComponent();

//

//TODO: добавьте код конструктора

//

ImageTime = 1;

Flag =1;

// ------------ ПРОРИСОВКА ТЕКСТА НАЧАЛО --------------------------------

this->Size = System::Drawing::Size(330,300);

this->Text = L"Hello GDI+";

this->Padding = System::Windows::Forms::Padding(0);

this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;

// ------------ ПРОРИСОВКА ТЕКСТА КОНЕЦ ---------------------------------

// ------------ ПРОРИСОВКА ПРЯМОУГОЛЬНИКОВ НАЧАЛО -----------------------

Drawing::Point point1 = Drawing::Point(40,30);

Drawing::Point point2 = Drawing::Point(50,20);

Drawing::Size size = Drawing::Size(60, 50);

rect1 = Drawing::Rectangle(point1, size);

rect2 = Drawing::Rectangle(point2, size);

// ------------ ПРОРИСОВКА ПРЯМОУГОЛЬНИКОВ КОНЕЦ ------------------------

}

Drawing::Rectangle rect1;

Drawing::Rectangle rect2;

protected:

// <summary>

/// Освободить все используемые ресурсы.

/// </summary>

~Form1()

{

if (components)

{

delete components;

}

}

private: System::Windows::Forms::Timer^ timer1;

protected:

private: System::ComponentModel::IContainer^ components;

private:

/// <summary>

/// Требуется переменная конструктора.

/// </summary>

#pragma region Windows Form Designer generated code

/// <summary>

/// Обязательный метод для поддержки конструктора - не изменяйте

/// содержимое данного метода при помощи редактора кода.

/// </summary>

void InitializeComponent(void)

{

this->components = (gcnew System::ComponentModel::Container());

this->timer1 = (gcnew System::Windows::Forms::Timer(this->components));

this->SuspendLayout();

//

// timer1

//

this->timer1->Enabled = true;

this->timer1->Tick += gcnew System::EventHandler(this, &Form1::timer1_Tick);

//

// Form1

//

this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);

this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;

this->ClientSize = System::Drawing::Size(851, 559);

this->Name = L"Form1";

this->Text = L"Form1";

this->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &Form1::Form1_Paint);

this->MouseDown += gcnew System::Windows::Forms::MouseEventHandler(this, &Form1::Form1_MouseDown);

this->ResumeLayout(false);

}

#pragma endregion

private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e)

{

// Задаем цвет и толщину пера

Pen^ MyPen = gcnew Pen(Color::Blue,2);

// Рисуем эллипс лица

e->Graphics->DrawEllipse(MyPen,0, 0, 200, 220+ImageTime);

// Рисуем закрытый глаз как дугу

e->Graphics->DrawArc(MyPen, 35, 35, 35, 35, 180, -180);

// Рисуем открытый глаз как эллипс

e->Graphics->DrawEllipse(MyPen, 120, 35, 35, 35);

// Рисуем нос как линию Безье (сплайн Безье )

e->Graphics->DrawBezier(MyPen, 100, 60, 120, 100, 90, 120,80, 100);

// Рисуем рот как канонический сплайн

cli::array<Point>^ apt = gcnew cli::array<Point>(4);

apt[0] = Point(60, 140);

apt[1] = Point(140, 140);

apt[2] = Point(100, 180);

apt[3] = Point(60, 140);

e->Graphics->DrawCurve(MyPen, apt, 0, 3, 0.9f);

// ------------ ПРОРИСОВКА ТЕКСТА НАЧАЛО --------------------------------

Graphics ^g = e->Graphics;

g->DrawString(Text,

gcnew Drawing::Font("Arial", 16), Brushes::Red, 75.0+ImageTime*2, 110.0+ImageTime);

// ------------ ПРОРИСОВКА ТЕКСТА КОНЕЦ ---------------------------------

//------------- ЕДИНИЦЫ ИЗМЕРЕНИЯ НАЧАЛО --------------------------------

g->DrawRectangle(Pens::Black, 5, 5, 50, 20);

// Прямоугольник первоначально рисуется в пикселях. Далее к нему применяется масштаб и он перемещается

//g->PageUnit = GraphicsUnit::Millimeter;

g->TranslateTransform(20+ImageTime,20);

g->DrawRectangle(Pens::Green, 5, 5, 50, 20);

//------------- ЕДИНИЦЫ ИЗМЕРЕНИЯ КОНЕЦ ---------------------------------

// ------------ ПРОРИСОВКА ПРЯМОУГОЛЬНИКОВ НАЧАЛО -----------------------

e->Graphics->DrawRectangle(Pens::Black, rect1);

e->Graphics->DrawRectangle(Pens::Black, rect2);

// ------------ ПРОРИСОВКА ПРЯМОУГОЛЬНИКОВ КОНЕЦ ------------------------ }

//=======================================================================

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)

{

int TEnd;

TEnd = 30;

Invalidate();

if((ImageTime < TEnd)&&(Flag==1)){ImageTime++;};

if((ImageTime == TEnd)){ImageTime--; Flag = 2;};

if((ImageTime < TEnd)&&(Flag==2)){ImageTime--;};

if((ImageTime == 1)){ Flag = 1;};

}

//=======================================================================

private: System::Void Form1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)

{

// Структора точки нажима мышки

Point p = Point(e->X, e->Y);

//Мы попадаем в объединение ?

if (Rectangle::Intersect(rect1, rect2).Contains(p))

Text = "Объединение";

//Мы попадаем в пересечение?

else if (Rectangle::Union(rect1, rect2).Contains(p))

Text = "Пересечение";

// Вне прямоугольников.

else

Text = "Вне прямоугольников";

}

};

Наши рекомендации