天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 46|回复: 0

ObjectARX编程--圆弧

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
[code]创建圆弧
CCalculation.cpp
AcGePoint3d CCalculation::Pt2dTo3d(AcGePoint2d pt)
{
    AcGePoint3d ptTemp(pt.x,pt.y,0);
    return ptTemp;
}
#include <math.h>
double CCalculation::PI()
{
    return* atan(1.0);
}
1
2
3
4
5
6
7
8
9
10
CreateEnt.cpp
//创建圆弧
AcDbObjectId CCreateEnt::CreateArc(AcGePoint3d ptCenter, AcGeVector3d vec, double radius, double starAngle, double endAngle)
{
    AcDbArc *pArc = new AcDbArc(ptCenter, vec, radius, startAngle, endAngle);
    //(圆心,平面,半径,起点角度,终点角度)
    /*StartAngle和EndAngle并不是起终点的角度,StartAngle可以认为是个参考角,
    默认是0,如果将圆弧绕圆心旋转10度,那这个StartAngle就是10度,EndAngle始终不变,是圆弧的圆心角。*/
    AcDbObjectId arcId;
    arcId = CCreate::PostToModelSpace(pArc);
    return arcId;
}

//创建位于XOY平面上的圆弧的函数
AcDbObjectId CCreateEnt::CreateArc(AcGePoint2d ptCenter, double radius, double startAngle, double endAngle)
{
    AcGeVector3d vec(0,0,1);
    return CCreateEnt::CreateArc(CCalculation::Pt2dTo3d(ptCenter),vec,radius,startAngle,endAngle);
}

//三点法创建圆弧
AcDbObjectId CCreateEnt::CreateArc(AcGePoint2d ptStart, AcGePoint2d ptOnArc, AcGePoint2d ptEnd)
{
    //使用几何类获得圆心,半径
    AcGeCircArc2d geArc(ptStart, ptOnArc, ptEnd);
    AcGePoint2d ptCenter = geArc.center();
    double radius = geArc.radius();

    //计算起始和终止角度
    AcGeVector2d vecStart(ptStart.x - ptCenter.x, ptStart.y - ptCenter.y);
    AcGeVector2d vecEnd(ptEnd.x - ptCenter.x, ptEnd.y - ptCenter.y);
    double startAngle = vecStart.angle();
    double endAngle = vecEnd.angle();       
    /*AcGeVector2d 类用来表示一个二维空间中的矢量,
    其成员函数 angle 返回该矢量和 X 轴正半轴的角度(用弧度来表示)。*/
    return CCreateEnt::CreateArc(ptCenter, radius, startAngle, endAngle);
}

//"起点,圆心,终点"创建圆弧
//这个函数的名称不再是 CreateArc,而是 CreateArcSCE,这是因为该函数的参数列表、返回值都与三点法的函数相同,无法实现函数的重载,就只能重新定义一个新的函数名称。
AcDbObjectId CCreateEnt::CreateArcSCE(AcGePoint2d ptStart, AcGePoint2d ptCenter, AcGePoint2d ptEnd)
{
    //计算半径
    double radius = ptCenter.distanceTo(ptStart);
    //计算起,终点角度
    AcGeVector2d vecStart(ptStart.x - ptCenter.x, ptStart.y - ptCenter.y);
    AcGeVector2d vecEnd(ptEnd.x - ptCenter.x, ptEnd.y - ptCenter.y);
    double startAngle = vecStart.angle();
    double endAngle = vecEnd.angle();
    //创建圆弧
    return CCreateEnt::CreateArc(ptCenter, radius, startAngle, endAngle);
}
//"起点,圆心,圆弧角度"创建圆弧
AcDbObjectId CCreateEnt::CreateArc(AcGePoint2d ptStart, AcGePoint2d ptCenter, double angle)
{
    //计算半径
    double radius = ptCenter.distanceTo(ptStart);
    //计算起点,终点角度
    AcGeVector2d vecStart(ptStart.x - ptCenter.x, ptStart.y - ptCenter.y);
    double startAngle = vecStart.angle();
    double endAngle = startAngle + angle;

    //创建圆弧
    return CCreateEnt::CreateArc(ptCenter, radius, startAngle, endAngle);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
acrxEntryPoint.cpp
#include "Calculation.h"
static void MLMyGroupAddArc()
{
    // 创建位于XOY平面上的圆弧-
    AcGePoint2d ptCenter(50, 50);
    CCreateEnt::CreateArc(ptCenter, 100 * sqrt((double)2) / 2, 5 * CCalculation::PI() / 4, 7 * CCalculation::PI() / 4);
  
    // 三点法创建圆弧-右
    AcGePoint2d ptStart(100, 0);
    AcGePoint2d ptOnArc(120, 50);
    AcGePoint2d ptEnd(100, 100);
    CCreateEnt::CreateArc(ptStart, ptOnArc, ptEnd);
  
    // “起点、圆心、终点”创建圆弧
    ptStart.set(100, 100);
    ptCenter.set(50, 50);
    ptEnd.set(0, 100);
    CCreateEnt::CreateArcSCE(ptStart, ptCenter, ptEnd);
  
    // “起点、圆心、圆弧角度”创建圆弧
    ptStart.set(0, 100);
    ptCenter.set(50, 50);
    CCreateEnt::CreateArc(ptStart, ptCenter, CCalculation::PI() / 2);
}[/code]

 

 

 

 

ObjectARX编程--圆弧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 15:28 , Processed in 0.137147 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表