@azazlo

Как найти точки пересечения 2х фигур с++?

Задача состоит в том,чтобы задать рандомом точки прямоугольника,треугольника и окружности.это я сделал. Я не могу найти точки пересечения прямоугольника и треугольника.

#include <stdlib.h>
#include <ctime>
// нужен для вызова функции time()
#include <time.h>
using namespace std;

//задаем структуру точек
struct Point
{
    int x;
    int y;
};

//структурируем точки треугольника
struct Triangle
{
    Point p1;
    Point p2;
    Point p3;
};

//структурируем точки прямоугольника
struct Rectangle
{
    Point p1;
    Point p2;
    Point p3;
    Point p4;
};

//структурируем центр и радиус окружности
struct Circle
{
    Point p;
    int radius;
};

//функция генерации рандомного числа
int GetRandomint(int min,int max)
{
    return (min + rand() % (max-min+1));
};

// задаем случайную генерацию ординаты и абсциссы точки
Point GetRandomPoint(int min,int max) {
    Point p;
    p.x = GetRandomint(min,max);
    p.y = GetRandomint(min,max);
    return p;
}

//задаем функцию генерации трех точек треугольника
 Triangle GetRandomTriangle(int min,int max)
{
    Triangle trian;
    trian.p1 = GetRandomPoint( min,max);
    trian.p2 = GetRandomPoint( min, max);
    trian.p3.x = trian.p2.x;
    trian.p3.y = trian.p1.y;
        return trian;
}

 //печать координаты точки
 void Print_point(Point p)
 {
    cout << "p(" << p.x << ";" << p.y << ")/n";
 }

 // печать координат треугольника
 void Print_triangle(Triangle trian)
 {
    Print_point(trian.p1);
    Print_point(trian.p2);
    Print_point(trian.p3);
    cout << "\n\n";
 }

 //выводим точки прямоугольника на экран( обращаем внимание,что третья точка строится по такому принципу: ордината третьей точки равна ординате 2-ой точки
 //а ее абсцисса  = абсциссе 1-ой точки) - таким образом создастся перпендикуляр и прямой угол нашему треугольнику
 void Print_trian(Triangle trian)
 {
    cout << trian.p1.x << " " << trian.p1.y << "\n";
    cout << trian.p2.x << " " << trian.p2.y << "\n";
    cout << trian.p3.x << " " << trian.p3.y << "\n\n";
 }


 //рандом точки прямоугольника (2-ух точек - они образуют диагональ)
 Rectangle GetRandomRectangle(int min,int max)
 {
    Rectangle rect;
    rect.p1 = GetRandomPoint(min,max);
    rect.p2 = GetRandomPoint(min,max);
    rect.p3.x = rect.p2.x;
    rect.p3.y = rect.p1.y;
    rect.p4.y = rect.p2.y;
    rect.p4.x = rect.p1.x;
    return rect;
 }

 // печать координат прямоугольника
 void Print_rectangle(Rectangle rect)
 {
    Print_point(rect.p1);
    Print_point(rect.p2);
    Print_point(rect.p3);
    Print_point(rect.p4);
    cout << "\n\n";
 }

 //выводим точки на экран на двук осях координат (в данном случае принцип идентичен приципу с прямоуг.треугольником)
 void Print_rectan(Rectangle rect)
 {
    cout << rect.p1.x << " " << rect.p1.y << "\n";
    cout << rect.p2.x << " " << rect.p2.y << "\n";
    cout << rect.p3.x << " " << rect.p3.y << "\n";
    cout << rect.p4.x << " " << rect.p4.y << "\n\n";
 }

 //Задаем рандомный центр и радиус (для центра - точку,для радиуса - целочисленное значение)
 Circle GetRandomCircle(int min,int max)
 {
    Circle circle;
    circle.p = GetRandomPoint(min,max);
    circle.radius = GetRandomint(min,max);
    return circle;
 }

 //Печать центра и радиуса
 void Print_cir(Circle circle)
    {
    Print_point(circle.p);
    cout << "radius = " << circle.radius << "\n";
    }

 //Выводим центр и радиус на экран
 void Print_circle(Circle circle)
 {
    cout << circle.p.x << " " << circle.p.y << "\n";
    cout << circle.radius << " " << "\n\n";
 }

 int main()
 {
    //подключаем русский язык и выводим конечный результат получения точек вершин наших фишур
    setlocale(LC_CTYPE, "rus");
    srand(time(NULL));
    Triangle trian = GetRandomTriangle(0,6);
    Rectangle rect = GetRandomRectangle(-10,10);
    Circle circle = GetRandomCircle(1,8);
    cout << "Координаты треугольника:\n";
    Print_trian(trian);
    cout << "Координаты прямоугольника:\n";
    Print_rectan(rect);
    cout << "Координаты центра окружности и его радиус:\n";
    Print_circle(circle);
    return 0;

 }
  • Вопрос задан
  • 897 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Вот тут хорошо расписано про пересечение двух отрезков. Вам надо лишь перебрать все пары отрезков прямоугольника X треугольника.

upd: На этом же сайте есть все что нужно для проверки пересечения окружности и отрезков.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Я не могу найти точки пересечения прямоугольника и окружности

Беда. Может, поискать - в поисковике?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы