#include <stdio.h>
#include <math.h>
#include <iostream>
#include <fstream>
#include <cstdio>
using namespace std;
int inOrNot(int poly_sides, double *poly_X, double *poly_Y, double *x, double *y, int n)
{
int i, j;
j = poly_sides - 1;
int res = 0;
for (i = 0; i < poly_sides; i++)
{
if ((poly_Y[i] < y[n] && poly_Y[j] >= y[n] || poly_Y[j] < y[n] && poly_Y[i] >= y[n]) && (poly_X[i] <= x[n] || poly_X[j] <= x[n]))
{
res ^= ((poly_X[i] + (y[n] - poly_Y[i]) / (poly_Y[j] - poly_Y[i])*(poly_X[j] - poly_X[i])) < x[n]);
}
j = i;
}
return res;
}
int main(void)
{ //main
int poly_sides = 4;
int m;
double alfa_deg = 0;
double PI = 3.1415926;
double alfa = alfa_deg * PI / 180;
double poly_X_R[4], poly_X[4] = { 21353241, 21354784, 21368139, 21368174 };
double poly_Y_R[4], poly_Y[4] = { 3627795, 3618680, 3623828, 3627546 };
double D = 171.0;
double L1 = 4.63 * D;
double L2 = 9.71 * D;
int a, b, Num;
printf("以弧度表示的主风向(相对于正北的顺时针角度):\n");
printf("alfa=%lf", alfa); //alfa为弧度表示
printf("\n");
printf("L1=%lf, L2=%lf", L1, L2);
printf("\n");
int i, j;
for (i = 0; i < poly_sides; i++)
{
poly_X_R[i] = cos(alfa)*poly_X[i] - sin(alfa)*poly_Y[i];
poly_Y_R[i] = cos(alfa)*poly_Y[i] + sin(alfa)*poly_X[i];
}
double max_X, min_X, max_Y, min_Y;
max_X = poly_X_R[0];
min_X = poly_X_R[0];
max_Y = poly_Y_R[0];
min_Y = poly_Y_R[0];
for (i = 1; i < poly_sides; i++)
{
if (poly_X_R[i] < min_X)
min_X = poly_X_R[i];
if (poly_X_R[i] > max_X)
max_X = poly_X_R[i];
if (poly_Y_R[i] < min_Y)
min_Y = poly_Y_R[i];
if (poly_Y_R[i] > max_Y)
max_Y = poly_Y_R[i];
}
printf("\n");
printf("坐标系旋转之后创建的矩形范围将多边形完整包含在内:\n");
printf("max_X=%lf, min_X=%lf, max_Y=%lf, min_Y=%lf", max_X, min_X, max_Y, min_Y);
printf("\n");
a = int((max_X - min_X) / L1);
b = int((max_Y - min_Y) / L2);
a = a + 1;
b = b + 1;
printf("\n");
printf("坐标系旋转之后在风场范围内可排布风机的最大列数a和最大行数b:\n");
printf("a=%d, b=%d", a, b);
printf("\n");
double A_R[50], B_R[50];
double x[1000], y[1000];
int X[1000], Y[1000];
int n = 10;
int k, l;
double deltaL1, deltaL2;
int Nm, Vertical, Horizontal, Same;
Nm = 1;
Vertical = 0;
Horizontal = 0;
Same = 0;
for (k = 0; k < n; k++)
{
for (l = 0; l < n; l++)
{
deltaL1 = (double)L1 * l * 1.0 / n;
deltaL2 = (double)L2 * k * 1.0 / n;
A_R[0] = min_X;
B_R[0] = max_Y;
for (i = 1; i < a; i++)
{
A_R[i] = A_R[(i - 1)] + L1;
}
for (j = 1; j < b; j++)
{
B_R[j] = B_R[(j - 1)] - L2;
}
for (i = 0; i < a; i++)
{
A_R[i] = A_R[i] + deltaL1;
}
for (j = 0; j < b; j++)
{
B_R[j] = B_R[j] - deltaL2;
}
for (j = 0; j < b; j++) {
for (i = 0; i < a; i++) {
if (j % 2 == 0)
{
x[(j * a) + i] = cos(alfa) * A_R[i] + sin(alfa) * B_R[j];
y[(j * a) + i] = cos(alfa) * B_R[j] - sin(alfa) * A_R[i];
}
if (j % 2 == 1)
{
x[(j * a) + i] = cos(alfa) * (A_R[i] + (0.5 * L1)) + sin(alfa) * B_R[j];
y[(j * a) + i] = cos(alfa) * B_R[j] - sin(alfa) * (A_R[i] + (0.5 * L1));
}
}
}
Num = 0;
for (m = 0; m < (a*b); m++) {
int ret;
ret = inOrNot(poly_sides, poly_X, poly_Y, x, y, m);
X[m] = int(x[m]);
Y[m] = int(y[m]);
if (1 == ret)
{
Num = Num + 1;
}
}
if (Num > Nm)
{
Nm = Num;
Vertical = k;
Horizontal = l;
Same = 0;
}
if (Num == Nm)
{
Same = Same + 1;
}
}
}
char TurbinesLocation_Cross[1000] = { '\0' };
int p, q, d;
p = int(deltaL1);
q = int(deltaL2);
d = int(D);
sprintf_s(TurbinesLocation_Cross, "交错排布__给定间距下风机排布数量最多的方案__H%d__坐标系第一次旋转后起始点平移__x向右平移%dm __y向下平移%dm.txt", d, p, q);
ofstream fout;
fout.open(TurbinesLocation_Cross);
if (fout.is_open())
{
deltaL1 = (double)L1 * Horizontal * 1.0 / n;
deltaL2 = (double)L2 * Vertical * 1.0 / n;
A_R[0] = min_X + deltaL1;
B_R[0] = max_Y - deltaL2;
for (i = 1; i < a; i++)
{
A_R[i] = A_R[(i - 1)] + L1;
}
for (j = 1; j < b; j++)
{
B_R[j] = B_R[(j - 1)] - L2;
}
printf("\n");
printf("************************************************************\n");
printf("以下为按照给定间距在该风场内交错排布风机数量最多的方案之一:\n");
printf("************************************************************\n");
printf("在给定间距条件下相同最多风机数目的排布方案共有%d种\n", Same);
printf("************************************************************\n");
printf("\n");
printf("deltaL1=%lf, deltaL2=%lf", deltaL1, deltaL2); //坐标平移量
printf("\n");
printf("坐标系旋转并且在两个方向上平移之后水平方向从左到右间隔 L1 的数值依次为:\n");
for (i = 0; i < a; i++)
{
printf("%lf\n", A_R[i]);
}
printf("\n");
printf("坐标系旋转并且在两个方向上平移之后竖直方向从上到下间隔 L2 的数值依次为:\n");
for (j = 0; j < b; j++)
{
printf("%lf\n", B_R[j]);
}
printf("\n");
for (j = 0; j < b; j++) {
for (i = 0; i < a; i++) {
if (j % 2 == 0)
{
x[(j * a) + i] = cos(alfa) * A_R[i] + sin(alfa) * B_R[j];
y[(j * a) + i] = cos(alfa) * B_R[j] - sin(alfa) * A_R[i];
}
if (j % 2 == 1)
{
x[(j * a) + i] = cos(alfa) * (A_R[i] + (0.5 * L1)) + sin(alfa) * B_R[j];
y[(j * a) + i] = cos(alfa) * B_R[j] - sin(alfa) * (A_R[i] + (0.5 * L1));
}
}
}
Num = 0;
for (m = 0; m < (a*b); m++) {
int ret;
ret = inOrNot(poly_sides, poly_X, poly_Y, x, y, m);
X[m] = int(x[m]);
Y[m] = int(y[m]);
if (1 == ret)
{
fout << X[m] << "," << Y[m] << endl;
Num = Num + 1;
}
}
printf("在该风场内按照给定间距交错排布最多可布置%d台风机\n", Num);
}
fout.close();
return 0;
} //main
评论1