c语言如何求菱形范围内随机点?即一个菱形图形,左边角点到右边角点宽度为800,上边角点到下边角点高度为600如何用C语言求一个坐标,要求该坐标点是随机到该菱形区域内的某点?

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/08 11:42:38
c语言如何求菱形范围内随机点?即一个菱形图形,左边角点到右边角点宽度为800,上边角点到下边角点高度为600如何用C语言求一个坐标,要求该坐标点是随机到该菱形区域内的某点?

c语言如何求菱形范围内随机点?即一个菱形图形,左边角点到右边角点宽度为800,上边角点到下边角点高度为600如何用C语言求一个坐标,要求该坐标点是随机到该菱形区域内的某点?
c语言如何求菱形范围内随机点?
即一个菱形图形,左边角点到右边角点宽度为800,上边角点到下边角点高度为600
如何用C语言求一个坐标,要求该坐标点是随机到该菱形区域内的某点?

c语言如何求菱形范围内随机点?即一个菱形图形,左边角点到右边角点宽度为800,上边角点到下边角点高度为600如何用C语言求一个坐标,要求该坐标点是随机到该菱形区域内的某点?
通过你的形容,菱形应该是类似◇来进行摆放的吧.
逆时针设置菱形四个顶点(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;
}