C语言编程 弧度角度

 我来答
sunnyhouyq
2014-03-20 · TA获得超过649个赞
知道小有建树答主
回答量:515
采纳率:100%
帮助的人:537万
展开全部
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

typedef struct point
{
    int x, y;
} Point;

typedef struct line
{
    int a,b,c;
} Line;

int point_equal( Point p1, Point p2 )
{
    if ( p1.x == p2.x && p1.y == p2.y )
        return 1;
    return 0;
}

int get_line( Point p1, Point p2, Line *l )
{
    if ( point_equal( p1, p2 ) )
        return -1;
    int m = ( p2.y - p1.y ); /** 两点式 ***/
    int n = ( p2.x - p1.x );
    l->a = m;
    l->b = -1*n;
    l->c = -1*m*p1.x + n*p1.y;
    return 0;
}

int get_intersection( Line l1, Line l2, Point *p3 )
{
    if ( (l1.a == 0 && l1.b == 0) || (l2.a==0&&l2.b==0) )
        return -2;

    if ( l1.a*l2.b == l2.a*l1.b )
        return -1;
    p3->x = ( l1.b*l2.c - l2.b*l1.c ) / ( l1.a*l2.b - l1.b*l2.a );
    p3->y = ( l1.a*l2.c - l2.a*l1.c ) / ( l1.b*l2.a - l1.a*l2.b );
    return 0;
}

double get_angle( Point inter, Point a, Point b )
{

    int va_x = abs(a.x - inter.x);
    int va_y = abs(a.y - inter.y);
    int vb_x = abs(b.x - inter.x);
    int vb_y = abs(b.y - inter.y);

    int product_value = (va_x * vb_x ) + ( va_y * vb_y );
    double va_val = sqrt( va_x * va_x + va_y * va_y );
    double vb_val = sqrt( vb_x * vb_x + vb_y * vb_y );
    double cos_val = product_value / ( va_val * vb_val );
    if ( cos_val < -1 && cos_val > -2 )
        cos_val = -1;
    else if ( cos_val > 1 && cos_val < 2 )
        cos_val = 1;
    return acos(cos_val);
}

int main()
{
    int n=0, i=0, a=0, b=0, c=0, d=0;
    Point *p, intersection, pa, pb;
    Line A, B;
    scanf( "%d", &n );
    p = (Point*)malloc( n*sizeof(Point) );
    for( i=0; i<n; i++ )
        scanf( "%d %d", &p[i].x, &p[i].y );

    scanf( "%d %d %d %d", &a, &b, &c, &d );
    get_line( p[a-1], p[b-1], &A );
    get_line( p[c-1], p[d-1], &B );
    get_intersection( A, B, &intersection );

    if ( point_equal( p[a-1], intersection ) )
    {
        pa.x = p[b-1].x;
        pa.y = p[b-1].y;
    }
    else
    {
        pa.x = p[a-1].x;
        pa.y = p[a-1].y;
    }
    if ( point_equal( p[c-1], intersection ) )
    {
        pb.x = p[d-1].x;
        pb.y = p[d-1].y;
    }
    else
    {
        pb.x = p[c-1].x;
        pb.y = p[c-1].y;
    }

    double angle = get_angle( intersection, pa, pb );
    printf( "%.2f\n", angle );
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
东莞大凡
2024-08-07 广告
标定板认准大凡光学科技,专业生产研发厂家,专业从事光学影像测量仪,光学投影测量仪.光学三维测量仪,光学二维测量仪,光学二维测量仪,光学三维测量仪,光学二维测量仪.的研发生产销售。东莞市大凡光学科技有限公司创立于 2018 年,公司总部坐落于... 点击进入详情页
本回答由东莞大凡提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式