猿问

请教下该如何用C语言求一个坐标,要求该坐标点是随机到该菱形区域内的某点???

即一个菱形图形,左边角点到右边角点宽度为800,上边角点到下边角点高度为600

湖上湖
浏览 190回答 3
3回答

互换的青春

#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); //计算直线方程斜率rr2 = (y2 - y3) / (x2 - x3);r3 = (y3 - y4) / (x3 - x4);r4 = (y4 - y1) / (x4 - x1);b1 = y1 - r1 * x1; //计算直线方程常量bb2 = 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点钟坐标。&nbsp;

RISEBY

通过你的形容,菱形应该是类似◇来进行摆放的吧。逆时针设置菱形四个顶点(12点方向是A,9点方向是B,6点方向是C,3点方向D。做直角坐标系,以菱形中心点为O点,四个点的坐标分别是:A(0, 400), B(-300, 0), C(0, -400), D(300, 0)&nbsp;方法:按照逆时针方向遍历这个菱形的每一条边的两个顶点(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 - y1int 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 ];&nbsp;coor_dif[i][1] = coor[(i + 1)%4][ 1 ] - coor[ i ][ 1 ];&nbsp;}printf("Input the \"q\" to quit.\n");while( comm != 'q'){x_ran = rand(1000); //随机坐标y_ran = rand(1000);&nbsp;&nbsp;printf("The coordinate of the random point is (%d, %d).\n", x_ran, y_ran);&nbsp;&nbsp;i = 0;while(i < 4){ //计算公式 r = (x2-x1)(y3-y1) - (y2-y1)(x3-x1)&nbsp;&nbsp;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;}&nbsp;&nbsp;i++;}if(i == 4){printf("Point (%d, %d) is in this diamond.\n", x_ran, y_ran);}comm = getchar();}return 0;}

慕码人8056858

解题思路都在图里了
随时随地看视频慕课网APP
我要回答