永发信息网

c语言如何求菱形范围内随机点???

答案:3  悬赏:70  手机版
解决时间 2021-11-16 01:48
  • 提问者网友:那叫心脏的地方装的都是你
  • 2021-11-15 14:14
c语言如何求菱形范围内随机点???
最佳答案
  • 五星知识达人网友:枭雄戏美人
  • 2021-11-15 15:22
通过你的形容,菱形应该是类似◇来进行摆放的吧。

逆时针设置菱形四个顶点(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;
}追问我急着用!

int 随机X点=0;//全局变量
int 随机Y点=0;//全局变量
void根据菱形四点坐标公式返回X.Y坐标的函数
(菱形12点钟X坐标,菱形12点钟Y坐标,菱形3点钟X坐标,菱形3点钟Y坐标,
菱形6点钟X坐标,菱形6点钟Y坐标,菱形9点钟X坐标,菱形9点钟Y坐标,)
帮我写一下这个函数,要求在函数里输入四点坐标,返回菱形范围内的随机坐标,返回值直接赋给int 随机X点,int 随机Y点两个全局变量就可以!万分感谢,给加分!追答#include "stdio.h"
#include "stdlib.h"

int rand_x = 0;
int rand_y = 0;

void ran_point_in_dia(int x_a, int y_a,int x_b, int y_b,int x_c, int y_c, int x_d,int y_d)
{
int coor[][2] = {x_a, y_a, x_b, y_b, x_c, y_c, x_d, y_d}; //存储四个顶点坐标及初始化
int coor_dif[4][2] = {0};

int y = 0; //坐标临时变量
int x = 0;

int i = 0; //循环控制
int flag = 0; //标志,判断该带点是否在比对向量的左边
int a = 0;
int b = 0;
//菱形为垂直摆放,所以可以算出随机坐标的取值范围
int height = (y_a - y_c); //求出菱形所在长方形的长与宽,用于减小随机数取值范围
int weight = (x_b - x_d);

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 ];
}
while(!flag)
{
x = rand()%weight + x_a;
y = rand()%height + y_c;
i = 0;
while(i < 4)
{ //计算公式 r = (x2-x1)(y3-y1) - (y2-y1)(x3-x1)
a = ( y - coor[ i ][ 1 ] ) * coor_dif[ i ][ 0 ]; //a = (x2-x1)(y3-y1)
b = ( x - coor[ i ][ 0 ] ) * coor_dif[ i ][ 1 ]; //b = (y2-y1)(x3-x1)
if( a - b < 0)
{
flag = 1;
break;
}
i++;
}
if(flag == 0)
{
rand_x = x;
rand_y = y;
printf("Point (%d, %d) is in this diamond.\n", x, y);
return ;
}
else
{
flag = 0;
printf("This point (%d, %d)is not in diamond.Next one.\n", x, y);
}
}
}

int main()
{
ran_point_in_dia(0,400,-300,0,0,-400,300,0);
getchar();
return 0;
}追问恩,我只要内存中返回数据就可以,不需要输出getchar();printf等语句,帮我整理一下好吗?我没看到你函数中那句返回了我设定的全局变量!?追答问题回答有字数限制,不能再完整的粘上代码了。
你自己做出两个地方的修改即可。
1.把 void ran_point_in_dia( ) 函数最后部分的if-else 中的printf删除即可;同时,你设定的全局变量在 if 下面实现了返回。所求菱形内随机点坐标已经存在 rand_x、 rand_y这两个全局变量之中。

if(flag == 0)
{
rand_x = x; //此处实现将所得随机坐标返回给你设定的全局变量之中。
rand_y = y;
return ; //此处返回,跳出 void ran_point_in_dia( ) 函数
}
else
{
flag = 0;
}

2.main() 函数的修改,那个getchar()函数只是用来预防 shell的闪现行为。没实质意义。

int rand_x = 0;
int rand_y = 0;

int main()
{
ran_point_in_dia(0,400,-300,0,0,-400,300,0);
return 0;
}

你把上面的代码按照这个方式修改一下就行了
全部回答
  • 1楼网友:纵马山川剑自提
  • 2021-11-15 17:37
#include "stdio.h"
#include "stdlib.h"
#include

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点钟坐标。
  • 2楼网友:患得患失的劫
  • 2021-11-15 15:59

解题思路都在图里了

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯