3 回答

TA贡献1797条经验 获得超6个赞
#include "stdio.h"
#include "stdlib.h"
#include<time.h>
int x = 0, y = 0;
void ret_area(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{
float r1, r2, r3, r4;
float b1, b2, b3, b4;
int sign = 1; //标志
r1 = (y1 - y2) / (x1 - x2); //计算直线方程斜率r
r2 = (y2 - y3) / (x2 - x3);
r3 = (y3 - y4) / (x3 - x4);
r4 = (y4 - y1) / (x4 - x1);
b1 = y1 - r1 * x1; //计算直线方程常量b
b2 = y2 - r2 * x2;
b3 = y3 - r3 * x3;
b4 = y4 - r4 * x4;
srand((unsigned)time(NULL));
//由此得到的x横坐标一定能落在菱形区域内
x = rand() % (x2 - x4) + x4; //菱形区域左右可取得的值
while(sign)
{
y = rand() % (y1 - y3) + y3; //菱形区域上下可取得的值
//以下四个条件让y纵坐标坐落在菱形区域内
if(y < r1 * x + b1)
if(y > r2 * x + b2)
if(y > r3 * x + b3)
if(y < r4 * x + b4)
sign = 0;
}
}
int main()
{
printf("x = %d, y = %d\n", x, y);
//ret_area(3, 7, 5, 2, 2, 1, 1, 3); //测试
printf("x = %d, y = %d\n", x, y);
return 0;
}
ret_area函数参数值一定是顺时针方向或者逆时针方向。(x1,y1)(x2,y2)(x3,y3)(x4,y4)表示12点钟、3点钟、6点钟、9点钟坐标。

TA贡献1856条经验 获得超5个赞
通过你的形容,菱形应该是类似◇来进行摆放的吧。
逆时针设置菱形四个顶点(12点方向是A,9点方向是B,6点方向是C,3点方向D。
做直角坐标系,以菱形中心点为O点,四个点的坐标分别是:A(0, 400), B(-300, 0), C(0, -400), D(300, 0)
方法:按照逆时针方向遍历这个菱形的每一条边的两个顶点(X1,Y1)和(X2,Y2),然后判断给定点是否在这条边矢量的左边就可以了。
而判断一个点是否在一个矢量的左边,可利用矢量叉积。
设A(x1,y1),B(x2,y2),给定点是C(x3,y3),构造两条矢量边:
AB=(x2-x1,y2-y1), AC=(x3-x1,y3-y1)
则AB和AC的叉积为(2*2的行列式):
|x2-x1, y2-y1|
|x3-x1, y3-y1|
值为:r = (x2-x1)(y3-y1) - (y2-y1)(x3-x1)
然后利用右手法则进行判断:
如果r > 0,则点C在矢量AB的左边
如果r < 0,则点C在矢量AB的右边
这样就可以判断点C与AB的相对位置了。然后按照逆时针方向,对菱形的每一条边都如此判断,如果每次都判断出C左边,那么就说明这个点在凸多边形内部了。
代码:
#include "stdio.h"
#include "stdlib.h"
int main()
{
int coor[][2] = {0, 400, -300, 0, 0, -400, 300, 0}; //存储四个顶点坐标及初始化
int coor_dif[4][2] = {0}; //存储上述的x2 - x1 以及 y2 - y1
int x_ran = 0; //存储任意点坐标
int y_ran = 0;
int a = 0; //存储公式的计算项
int b = 0;
int flag = 0; //标志,判断该带点是否在比对向量的左边
char comm = 'g'; //循环控制指令
int i = 0; //循环辅助
for( ; i < 4; i ++) //把各点差值记录下来
{
coor_dif[i][0] = coor[(i + 1)%4][ 0 ] - coor[ i ][ 0 ];
coor_dif[i][1] = coor[(i + 1)%4][ 1 ] - coor[ i ][ 1 ];
}
printf("Input the \"q\" to quit.\n");
while( comm != 'q')
{
x_ran = rand(1000); //随机坐标
y_ran = rand(1000);
printf("The coordinate of the random point is (%d, %d).\n", x_ran, y_ran);
i = 0;
while(i < 4)
{ //计算公式 r = (x2-x1)(y3-y1) - (y2-y1)(x3-x1)
a = ( y_ran - coor[ i ][ 1 ] ) * coor_dif[ i ][ 0 ]; //a = (x2-x1)(y3-y1)
b = ( x_ran - coor[ i ][ 0 ] ) * coor_dif[ i ][ 1 ]; //b = (y2-y1)(x3-x1)
if( a - b >= 0)
{
flag = 1;
break;
}
i++;
}
if(i == 4)
{
printf("Point (%d, %d) is in this diamond.\n", x_ran, y_ran);
}
comm = getchar();
}
return 0;
}
- 3 回答
- 0 关注
- 189 浏览
添加回答
举报