您的位置:首页 > 理论基础 > 数据结构算法

已知2点坐标求出此2点构成直线的角度 并求出再此之后新的不同的2点构成直线与之前直线的角度差或者弧度差

2011-11-15 10:32 821 查看
 

http://zhidao.baidu.com/question/200009663.html

 

分求 编程 c语言 已知2点求角度

检举
| 2010-11-23 14:20

提问者:myempty
| 悬赏分:160
| 浏览次数:531次

c  c++语言里 已知2点坐标求出此2点构成直线的角度 并求出再此之后新的不同的2点构成直线与之前直线的角度差或者弧度差
回答正确后再追加100分


问题补充:

其实思路我有 和你的基本一样 但是写出的代码 总是不对 所有希望是源码


检举
| 2010-11-25 14:12

最佳答案

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define pi 3.1415926

struct point
{
double X;
double Y;
};

struct line
{
point A;
point B;
double deg;
};

int main( )
{
line lineA;
line lineB;

double tmp;

printf("请输点坐标(x,y)构造第一条直线\n");
printf("第一点x与y:");
scanf( "%lf%lf", &lineA.A.X, &lineA.A.Y );
printf("第二点x与y:");
scanf( "%lf%lf", &lineA.B.X, &lineA.B.Y );

//求角度
tmp=(lineA.B.Y-lineA.A.Y)/(lineA.B.X-lineA.A.X);
lineA.deg=atan(tmp);
lineA.deg=lineA.deg*double(180)/pi;
printf( "第一条直线斜线角度:%lf,%lf\n", tmp,lineA.deg );

printf("请输点坐标(x,y)构造第二条直线\n");
printf("第一点x与y:");
scanf( "%lf%lf", &lineB.A.X, &lineB.A.Y );
printf("第二点x与y:");
scanf( "%lf%lf", &lineB.B.X, &lineB.B.Y );

//求角度
tmp=(lineB.B.Y-lineB.A.Y)/(lineB.B.X-lineB.A.X);
lineB.deg=atan(tmp);
lineB.deg=lineB.deg*double(180)/pi;
printf( "第二条直线斜线角度:%lf,%lf\n", tmp,lineB.deg );

printf( "两条直线角度差:%lf\n", lineA.deg-lineB.deg );

return 0;
}
/*
atan等三角函数算出来的是pi形式的,看看45度的:
printf("%f\n",tan(double(45)/double(180)*pi));
printf("%f\n",atan(1)*double(180)/pi);

写的真累,看你题目是C语言,所以没用C++类来写
用类来写,又好写,又好读,又不容易出错

point点(x,y)其实可以直接用COORD,又怕你没有数据结构COORD
比如:
struct line
{
point A;
point B;
double deg;
};
改成
struct line
{
COORD dian;     //COORD编译器数据结构dian有dian.X和dian.Y
double deg;
};
*/


 
检举
| 2010-11-23 14:32

虽然分数很高,但还是懒得写代码,给出思路供参考

把第一个点作为原点,先求出目标点的相对位置及所在象限,用反sin函数求出角度

第二条直线需要平移到上面使用的原点,然后角度就出来了


 
检举
| 2010-11-23 20:07
做而论道

| 十四级

需要应用 math.h 中的计算函数,反正切即可求出角度。


赞同
0

|检举
| 2010-11-25 14:03
vqusu66
| 二级

#include<stdio.h>
#define N 80/*宏定义N为80*/

int fun(char *str)/*声明调用函数fun*/
{int i,n=0,fg=1;/*定义变量i,n,fg*/
char *p=str;/*指针p指向字符数组*/
while (*p)/*while语句循环统计字符串长度*/
{n++;
p++;}
for (i=0;i<n/2;i++)
if (str[i]==str[n-1-i]);/*for循环判断顺读和倒读是否都是一样的字符串并维持fg原来的值1*/
else
{fg=0;/*否则改变fg的值为0,然后跳出循环*/
break;}
return fg;}/*返回fg的值*/

main()/*主函数*/
{char s
;/*定义数组s*/
printf("Enter a string:"); gets(s);/*输入字符串*/
printf("\n\n");puts(s);/*空格后输出字符串*/
if(fun(s)) printf("YES\n");/*调用函数fun如果返回值是1输出YES*/
else       printf("NO\n");/*否则输出NO*/
getch();/*此语句用来从键盘输入缓冲区读取下一个键盘输入字符的,返回值为读取的字符*/
}
如果还没解决你的问题,可以加我百度HI账号。


检举
| 2010-11-25 14:12
BlueWanderer
| 十一级

#include <stdio.h>
#include <math.h>

#define __pi 3.1415926535897932384626433832795

int main()
{
int x0, y0, x1, y1;

scanf("%d%d", &x0, &y0);

if (x0 != 0)
{
printf("%.4f\n", atan((double)y0 / x0) / __pi * 180);
}
else
{
puts("Input error.");

return 0;
}

scanf("%d%d", &x1, &y1);

if (x1 != 0)
{
printf("%.4f\n", (atan((double)y1 / x1) - atan((double)y0 / x0)) / __pi * 180);
}
else
{
puts("Input error.");
}

return 0;
}


检举
| 2010-11-28 04:08
wacs5

| 十四级

/*****************************************************************
*Author  :wacs5
*DATE   :20101128(YYYMMDD)
*Email   :wacs5@126.com
*Function  : 已知2点求角度(主要使用atan2函数)
*Compiler  :TC2.0通过(如果是VC++的话,去掉#include <conio.h>)
*    *另外getch()函数可以换成system("pause")语句.
*Problem  :http://zhidao.baidu.com/question/200009663.html
*****************************************************************/
#include <stdio.h>
#include <conio.h>
#include <math.h>

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

typedef struct Point_tag
{
double x;
double y;
}Point;
typedef struct Line_tag
{
Point p[2];
}Line;

int main()
{
int i;
Line L1,L2;
double a1,a2;
int PointInput(Point *p);   /*点输入录入*/
int LineInput(Line *l);   /*线输入录入*/
double rad2deg(double rad); /*弧度转角度*/
double LineAngle(Line *l);  /*一条线(两个点)的角度*/
double TwoLineAngle(Line *l1,Line *l2);  /*两条线的夹角*/

L1.p[0].x=0;
L1.p[0].y=0;
L1.p[1].x=1;
L1.p[1].y=1;

L2.p[0].x=1;
L2.p[0].y=1;
L2.p[1].x=1/2;
L2.p[1].y=sqrt(3);

/*  LineInput(&L1);
LineInput(&L2); */
a1=LineAngle(&L1);
a2=TwoLineAngle(&L1,&L2);
printf("a1=%lf\n",rad2deg(a1));
printf("a2=%lf\n",rad2deg(a2));
getch();
return 0;
}

int PointInput(Point *p)
{
scanf("%lf",&p->x);
scanf("%lf",&p->y);
return 0;
}

int LineInput(Line *l)
{
printf("Input point[0] coord:");
PointInput(&l->p[0]);
printf("Input point[1] coord:");
PointInput(&l->p[1]);
return 0;
}

double rad2deg(double rad)
{
return rad*180/M_PI;
}

double LineAngle(Line *line)
{
return atan2(  line->p[1].y - line->p[0].y, line->p[1].x - line->p[0].x);
}

double TwoLineAngle(Line *l1,Line *l2) /*两条线夹角,化为两条线各自与x轴夹角之差*/
{
return LineAngle(l2)-LineAngle(l1);
}


检举
| 2010-12-2 19:13 热心网友

int fun(char *str)/*声明调用函数fun*/
{int i,n=0,fg=1;/*定义变量i,n,fg*/
char *p=str;/*指针p指向字符数组*/
while (*p)/*while语句循环统计字符串长度*/
{n++;
p++;}
for (i=0;i<n/2;i++)
if (str[i]==str[n-1-i]);/*for循环判断顺读和倒读是否都是一样的字符串并维持fg原来的值1*/
else
{fg=0;/*否则改变fg的值为0,然后跳出循环*/
break;}
return fg;}/*返回fg的值*/


检举
| 2010-12-4 20:46
wuys825
| 一级

从高的抽象层面想问题,从具体的层面做事情!
给出方法:
设两点为p1(x1,y1),p2(x2,y2)则向量p1p2=(x2-x1,y2-y1).
x轴的单位向量e=(1,0)则直线p1p2与x轴的所成角的为∠a,则:
cos(∠a)=(x2-x1)/sqrt((x2-x1)^2+(y2-y1)^2)        (1)
通过反余弦函数可求的
∠a=acos((x2-x1)/sqrt((x2-x1)^2+(y2-y1)^2))   (2)
设第二条线于x轴所成角为∠b,通过式(2)可求出,则与第一条直线的夹角为∠c:
∠c=∠b-∠a.     (3)
有了式(2)和(3)你还编不出相应的程序来吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐