Pilallamarri chandhu Ответов: 2

Как я могу сделать это эффективно


Рассмотрим следующий код:
#include <string>
класс пересекается {
общественный:
статические конструкторы и перекрытия(СТД::строка polygonA, СТД::строка polygonB);
};
боол пересекаются::внахлест(СТД::строка polygonA, СТД::строка polygonB) {
// реализация идет здесь
вернуть true;
}

Реализуйте метод Intersect::overlap, чтобы он возвращал true, если существует перекрытие с двумя выпуклыми полигонами polygonA и polygonB, предоставленными в качестве входных данных, и возвращал false, если такого перекрытия не существует. Он также должен работать с невыпуклыми многоугольниками.

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

экс:
формат ввода: std::string polygonAlpha = "0 0,0 1,2 0,0 0";
std::string polygonBravo = "1 0,1 1,3 0,1 0";
std::string polygonCharlie = "2 2,2 3,4 2,2 2";

Что я уже пробовал:

std::vector<int> vect;
    std::vector<int> vect1;
    
    std::stringstream ss(polygonA);
	std::stringstream ss1(polygonB);

    for (int i; ss >> i;) {
        vect.push_back(i);    
        if (ss.peek() == ',')
            ss.ignore();
    }
	for (int i; ss1 >> i;) {
        vect1.push_back(i);    
        if (ss.peek() == ',')
            ss.ignore();
    }
	// if signed area of a polygon is negative then it's clockwise oriented if it's positive counter clockwise oriented
	int signedarea=0;
   
    signedarea=signedarea+ (vect[0]*vect[3]-vect[1]*vect[2])+vect[2]*vect[5]-vect[3]*vect[4]+vect[4]*vect[7]-vect[5]*vect[6];
    std::cout << signedarea << std::endl;

Richard MacCutchan

В чем же вопрос?

2 Ответов

Рейтинг:
2

KarstenK

Вам лучше реализовать класс polygon, который принимает строку в качестве входных данных. В конструктор или разбирать лучше использовать функция должна преобразовать строку цифр в число с некоторой функцией, как Атой потому что математика со строками-это ерунда Это также лучшая точка для проверки значений для некоторых условий.

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

Удачи тебе с домашним заданием. И не торопитесь решать свою задачу на таком продвинутом уровне. Оно того стоит.


Рейтинг:
2

Stefan_Lang

Просто глядя на ваш код, есть две проблемы:

1. В свой второй цикл, на который вы ссылаетесь, СС (дважды), где вы должны использовать вместо СС1

2. хотя вы использовали циклы для интерпретации строки координат, вы не использовали циклы для вычисления подписанной области. Вы также должны изменить это на циклы, иначе ваша программа не будет работать, если у вас есть меньше или больше 4 точек в ваших полигонах.

Кроме того, вам не хватает кода для пересечения. Для выпуклых многоугольников вы можете просто проверить, находится ли какой-либо угол одного многоугольника внутри другого. Но для вогнутых полигонов это вообще не сработает. Здесь вам нужно написать функцию, которая проверяет, пересекаются ли два линейных сегмента, а затем вам нужно проверить пересечения для всех сторон двух полигонов. (n*m проверяет, имеют ли ваши полигоны n и m сторон соответственно)