版权声明:本文为阿木寺的原创文章,未经本人允许不得转载。 https://blog.csdn.net/amusi1994/article/details/82748449
题目描述
输入:
10
-691.73,88.01,49.79,-385.15,-875.39,582.77,-881.35,-161.08,142.74,-127.58,729.19,694.82,30.03,-248.93,-246.78,346.60,-625.40,-482.68,893.79,-448.39
5
-109.96,12.34,-25.01,-356.86,-39.88,574.36,661.71,-336.38,346.50,94.99
输出:
(-109.96,12.34) (-25.01,-356.86)
C++代码
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
typedef struct point{
float x;
float y;
}POINT;
POINT LPPOINT[100];
bool PtInPolygon(POINT p, vector<POINT> &ptPolygon, int nCount)
{
// 交点个数
int nCross = 0;
for (int i = 0; i < nCount; i++)
{
POINT p1 = ptPolygon[i];
POINT p2 = ptPolygon[(i + 1) % nCount];// 最后一个点与第一个点连线
if (p1.y == p2.y)
continue;
if (p.y < min(p1.y, p2.y))
continue;
if (p.y >= max(p1.y, p2.y))
continue;
// 求交点的x坐标
double x = (double)(p.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;
// 只统计p1p2与p向右射线的交点
if (x > p.x)
{
nCross++;
}
}
// 交点为偶数,点在多边形之外
return (nCross % 2 == 1);
}
vector<string> split(const string &s, const string &seperator){
vector<string> result;
typedef string::size_type string_size;
string_size i = 0;
while (i != s.size()){
//找到字符串中首个不等于分隔符的字母;
int flag = 0;
while (i != s.size() && flag == 0){
flag = 1;
for (string_size x = 0; x < seperator.size(); ++x)
if (s[i] == seperator[x]){
++i;
flag = 0;
break;
}
}
//找到又一个分隔符,将两个分隔符之间的字符串取出;
flag = 0;
string_size j = i;
while (j != s.size() && flag == 0){
for (string_size x = 0; x < seperator.size(); ++x)
if (s[j] == seperator[x]){
flag = 1;
break;
}
if (flag == 0)
++j;
}
if (i != j){
result.push_back(s.substr(i, j - i));
i = j;
}
}
return result;
}
int main()
{
int n;
scanf("%d", &n);
//cout << n << endl;
cin.get(); // 释放缓冲区
string s_vertexs;
getline(cin, s_vertexs);
//cout << s_vertexs<<endl;
vector<POINT> v_vertexs;
v_vertexs.resize(n);
vector<string> v = split(s_vertexs, ","); //可按多个字符来分隔;
/*for (vector<string>::size_type i = 0; i != v.size(); ++i)
cout << v[i] << endl;*/
for (int i = 0; i < n; ++i){
v_vertexs[i].x = atof(v[2*i].c_str());
v_vertexs[i].y = atof(v[1+2*i].c_str());
}
/*for (int i = 0; i < n; ++i){
cout<< v_vertexs[i].x <<" " <<v_vertexs[i].y<<endl;
}*/
// pro2
int m;
scanf("%d", &m);
//cout << n << endl;
cin.get(); // 释放缓冲区
string s_search_vertexs;
getline(cin, s_search_vertexs);
//cout << s_vertexs<<endl;
vector<POINT> v_search_vertexs;
v_search_vertexs.resize(m);
vector<string> v_s = split(s_search_vertexs, ","); //可按多个字符来分隔;
for (int i = 0; i < m; ++i){
v_search_vertexs[i].x = static_cast<float>(atof(v_s[2 * i].c_str()));
v_search_vertexs[i].y = static_cast<float>(atof(v_s[1 + 2 * i].c_str()));
}
// 其实上述输入字符串再分割,确实太麻烦了,建议使用: scanf("(%d,%d,)")的格式
/*for (int i = 0; i < m; ++i){
cout << v_search_vertexs[i].x << " " << v_search_vertexs[i].y << endl;
}*/
bool flag = false;
for (int i = 0; i < m;++i)
{
if (PtInPolygon(v_search_vertexs[i], v_vertexs, n)){
//cout << "("<<v_search_vertexs[i].x << "," << v_search_vertexs[i].y <<") ";
printf("(%.2f,%.2f) ", v_search_vertexs[i].x, v_search_vertexs[i].y);
flag = true;
}
}
if (!flag){
cout << "No";
}
return 0;
}