c语言如何求菱形范围内随机点???通过你的形容 , 菱形应该是类似◇来进行摆放的吧 。
逆时针设置菱形四个顶点(12点方向是A,9点方向是B,6点方向是C,3点方向D 。
做直角坐标系,以菱形中心点为O点,四个点的坐标分别是用C语言求带范围函数方程:A(0, 400), B(-300, 0), C(0, -400), D(300, 0)
方法:按照逆时针方向遍历这个菱形的每一条边的两个顶点(X1,Y1)和(X2,Y2),然后判断给定点是否在这条边矢量的左边就可以用C语言求带范围函数方程了 。
而判断一个点是否在一个矢量的左边,可利用矢量叉积 。
设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)
然后利用右手法则进行判断:
如果r0,则点C在矢量AB的左边
如果r0,则点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( ; i4; i)//把各点差值记录下来
{
coor_dif[i][0] = coor[(i1)%4][ 0 ] - coor[ i ][ 0 ];
coor_dif[i][1] = coor[(i1)%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(i4)
{//计算公式 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;
【用C语言求带范围函数方程 用c语言求带范围函数方程的数值】}
if(i == 4)
{
printf("Point (%d, %d) is in this diamond.\n", x_ran, y_ran);
}
comm = getchar();
}
return 0;
}
C语言编程 编写函数用以求表达式(x)2-5x 4的值,x作为参数传送给函数.调用此函数求:#include stdio.h
#include math.h
double sum1(double x)
{double y1;
y1=(x-1)*(x-4);
return y1;
}
double sum2(double x)
{double y2;
y2=(x 15-1)*(x 15-4);
return y2;
}
double sum3(double x)
{double y3;
y3=(sin(x)-1)*(sin(x)-4);
return y3;
}
main()
{double x,y1,y2,y3;
printf(" y1=x^2-5x 4 \n y2=(x 15)^2-5(x 15) 4 \n y3=sin^2x-5sinx 4 \n请输入x求y1、y2、y3用C语言求带范围函数方程的值:");
scanf("%lf",x);
printf("解: \n y1=%lf \n y2=%lf \n y3=%lf \n",sum1(x),sum2(x),sum3(x));
getch();
}
C语言求助浮点数1/3可不是精确数,如果想要计算任意次方,不要传负的被开方数(用C语言求带范围函数方程你看负数为底指数函数图像不存在,就知道负数并不能在实数范围内任意开方),如果是为了开立方 , 请用cbrt()函数 。我想,你是要计算三次方程的根吧?貌似不会用到其他任意次方根,就用sqrt()函数和cbrt()函数就是 。
好吧 , 我的是VS2013,想不到VS2012与VS2013差那么远 。。。
要么升级到VS2013预览版,要么就试着这样自己写一个cbrt函数用C语言求带范围函数方程:
float cbrtf(float n)
{
float nn=fabs(n);
nn=pow(nn,1.0/3.0);
if(n0) nn*=-1;
return nn;
}
用C语言编写一个函数 , 求二元一次方程表达式X2 XY Y2的函数double ff( double x, double y)
{
double a = x*x x*y y*y;
return a;
}
int main()
{
double a = ff( 33.36, 4.45);
printf("%f",a );
return 0 ;
}
C语言编程问题在一个二维平面上给定两个圆的圆心横纵坐标、半径共6个参数, 求交点. 这个问题无非是解二元二次方程组. 普通二元二次方程联立消元求解的困难在于, 中间过程里的系数会变得非常复杂, 从而导致容易出错---因为公式毕竟还是要人来推导, 人的出错率比计算机要高得多得多---改用圆的参数方程求解, 可以在显著地减轻这个负担.
现在谈谈这问题的求解过程. 选择圆的参数方程的好处是方程是一次的, 化简方便, 虽然是三角函数方程并且既有正弦也有余弦, 不过到最后可以很方便地求出来.
(下面分析中x^y表示x的y次方)
大家还记得圆的参数方程吧, 圆心 (x0, y0), 半径为 r 的圆的参数方程是:
x = r * cosθx0
y = r * sinθy0
假设现在两圆参数x1, y1, r1, x2, y2, r2(这些分别表示, 咳, 有谁看不出来它们分别表示什么吗?), 设交点为 (x, y), 代入其中一个圆中的参数 方程有
x = r1 * cosθx1 且 y = r1 * sinθy1
代入另一圆的标准 方程, 得到
(r1 * cosθx1 - x2)^2(r1 * sinθy1 - y2)^2 = r2^2
是的, 看起来有关于正余弦二次项, 不过不要惊慌, 展开合并同类项之后, 正好这两项会合并成常数:
左边 = (r1 * cosθ)^2(r1 * sinθ)^2
2 * r1 * (x1 - x2) * cosθ2 * r1 * (y1 - y2) * sinθ
= r2^2 - (x1 - x2)^2 - (y1 - y2)^2 = 右边
这样就好办了, 把 r1^2 转移到等式右边, 令:
a = 2 * r1 * (x1 - x2)
b = 2 * r1 * (y1 - y2)
c = r2^2 - r1^2 - (x1 - x2)^2 - (y1 - y2)^2
那么方程便成为:
a * cosθb * sinθ = c
用 (1 - (cosθ)^2)^(1 / 2) 表示sinθ, 令:
p = a^2b^2
q = -2 * a * c
r = c^2 - b^2
便化为一个一元二次方程, 解得:
cosθ = (±(q^2 - 4 * p * r)^(1 / 2) - q) / (2 * p)
然而到此为止还没有结束, 因为刚才将三角方程转化为二次方程时, 等式两边平方了一次, 如果直接这样求对应角的正弦值, 符号总会为正. 为了将纵坐标正确解出, 必须变角. 那么如何变角?方法当然很多, 诱导公式, 或者反过头去把方程变一下, 以正弦作为未知数, 但是这些方法都比较复杂. 在这里可以选择另一种方案, 那就是用验证代替求解: 验证所得的解是不是根, 如果不是, 将纵坐标反号便可以了. 最后注意一下两解的横坐标相同的情况, 这样要先输出正的再输出负的.
下面上代码
#includemath.h // sqrt fabs
// 点
struct point_t {
double x, y;
};
// 圆
struct circle_t {
struct point_t center;
double r;
};
// 浮点数判同
int double_equals(double const a, double const b)
{
static const double ZERO = 1e-9;
return fabs(a - b)ZERO;
}
// 两点之间距离的平方
double distance_sqr(struct point_t const* a, struct point_t const* b)
{
return (a-x - b-x) * (a-x - b-x)(a-y - b-y) * (a-y - b-y);
}
// 两点之间的距离
double distance(struct point_t const* a, struct point_t const* b)
{
return sqrt(distance_sqr(a, b));
}
/*
* 两圆相交函数
* 参数:
*circles[0] 和 circles[1] 分别是两个圆.
*points[0] 和 points[1] 用来存放交点数值, 虽然有些情况下两个不都会用上;
*如果用到了两个交点, 那么返回后, 横坐标大的在前, 如果横坐标一样, 则纵坐标大的在前.
* 返回值:
*-1 如果两个圆一模一样;
*其它整数值: 交点个数.
*/
int insect(struct circle_t circles[], struct point_t points[])
{
double d, a, b, c, p, q, r; // a, b, c, p, q, r 与上面分析中的量一致
double cos_value[2], sin_value[2]; // 交点的在 circles[0] 上对应的正余弦取值
// 余弦值 cos_value 就是分析中的 cosθ
if (double_equals(circles[0].center.x, circles[1].center.x)
double_equals(circles[0].center.y, circles[1].center.y)
double_equals(circles[0].r, circles[1].r)) {
return -1;
}
d = distance(circles[0].center, circles[1].center); // 圆心距离
if (dcircles[0].rcircles[1].r
|| dfabs(circles[0].r - circles[1].r)) {
return 0;
}
a = 2.0 * circles[0].r * (circles[0].center.x - circles[1].center.x);
b = 2.0 * circles[0].r * (circles[0].center.y - circles[1].center.y);
c = circles[1].r * circles[1].r - circles[0].r * circles[0].r
- distance_sqr(circles[0].center, circles[1].center);
p = a * ab * b;
q = -2.0 * a * c;
// 如果交点仅一个
if (double_equals(d, circles[0].rcircles[1].r)
|| double_equals(d, fabs(circles[0].r - circles[1].r))) {
cos_value[0] = -q / p / 2.0;
sin_value[0] = sqrt(1 - cos_value[0] * cos_value[0]);
points[0].x = circles[0].r * cos_value[0]circles[0].center.x;
points[0].y = circles[0].r * sin_value[0]circles[0].center.y;
// 在这里验证解是否正确, 如果不正确, 则将纵坐标符号进行变换
if(!double_equals(distance_sqr(points[0], circles[1].center),
circles[1].r * circles[1].r)) {
points[0].y = circles[0].center.y - circles[0].r * sin_value[0];
}
return 1;
}
r = c * c - b * b;
cos_value[0] = (sqrt(q * q - 4.0 * p * r) - q) / p / 2.0;
cos_value[1] = (-sqrt(q * q - 4.0 * p * r) - q) / p / 2.0;
sin_value[0] = sqrt(1 - cos_value[0] * cos_value[0]);
sin_value[1] = sqrt(1 - cos_value[1] * cos_value[1]);
points[0].x = circles[0].r * cos_value[0]circles[0].center.x;
points[1].x = circles[0].r * cos_value[1]circles[0].center.x;
points[0].y = circles[0].r * sin_value[0]circles[0].center.y;
points[1].y = circles[0].r * sin_value[1]circles[0].center.y;
// 验证解是否正确, 两个解都需要验证.
if (!double_equals(distance_sqr(points[0], circles[1].center),
circles[1].r * circles[1].r)) {
points[0].y = circles[0].center.y - circles[0].r * sin_value[0];
}
if (!double_equals(distance_sqr(points[1], circles[1].center),
circles[1].r * circles[1].r)) {
points[1].y = circles[0].center.y - circles[0].r * sin_value[1];
}
// 如果求得的两个点坐标相同, 则必然其中一个点的纵坐标反号可以求得另一点坐标
if (double_equals(points[0].y, points[1].y)
double_equals(points[0].x, points[1].x)) {
if(points[0].y0) {
points[1].y = -points[1].y;
} else {
points[0].y = -points[0].y;
}
}
return 2;
}
本文来自CSDN博客,转载请标明出处:
C语言编程,指针,编写函数 , 用牛顿迭代法求方程f(x)=2x3-4x2 3x-6=0在1.5附近的根 。请给出运算结果#include stdio.h
#include math.h
double root(double (*f)(double),double (*f1)(double), double x,double eps);
double fx(double x){
return 2*x*x*x-4*x*x 3*x-6;
}
double fp(double x){
return 6*x*x-8*x 3;
}
int main()
{
double x=1.5,y,eps=1e-08;
printf("input eps 1e-08\n"); scanf("%lf",eps);
y = root(fx,fp,x,eps);
printf("%lf\n",y);
return 0;
}
double root(double (*f)(double x),double (*f1)(double x), double x,double eps){
double x0,x1;
x0=x;
while(1){
x1= x0 - (*f)(x0)/ (*f1)(x0);
if (fabs(x1-x0)eps) break;
x0=x1;
};
return x1;
}
运行与输出用C语言求带范围函数方程:
input eps 1e-08
1e-08
2.000000
关于用C语言求带范围函数方程和用c语言求带范围函数方程的数值的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 水仙花数程序Python,水仙花数 python
- 如何做好科研ppt,如何做好科研工作心得体会
- 苹果下载软件app,苹果下载软件app内购买什么意思
- php向ldap插入数据 php调用dll接口
- jquery怎么给video赋值的简单介绍
- 最大的安卓单机游戏,安卓超大型单机游戏
- 玩益智游戏太卡怎么办,玩益智游戏的感受
- mysql清理不掉怎么办 清理mysqlbin
- mysql查看一天内的文件,mysql查看数据文件大小