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

 

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[N];/*定义数组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)你还编不出相应的程序来吗? 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值