谁有用C语言编写的直线,圆弧插补程序

谁有用C语言编写的直线,圆弧插补程序,第1张

/*************************************************************************

   Function:          int ArcXY(double dfx0,double dfy0,double dfrx,

                               double dfry,int angle)

   Description:       在X-Y轴所构成的平面上,以圆弧运动的方式从目前位置经过指

                     定的参考点到目的点。调用此函数成功将增加运动命斗档敬令的库存数目。 

   Parameters:        dfx0, dfy0     参考点的X-Y轴座标值

                     dfrx, dfry     圆心的X-Y轴座标值

                     angle          插补角度

   Calls:             无   

   Return Value:      大於或等於0      给予此运动命令的编码

                     小於0            失败,传回值的意义可参考错误信息代码

**************************************************************************/

#include <stdio.h>

#include <math.h>

int ArcXY(double dfx0,double dfy0,double dfrx, double dfry,int angle)

int symbol(double number)

main()

{

ArcXY(0,0,-3,5,360)

getch()

}

int ArcXY(double dfx0,double dfy0,double dfrx, double dfry,int angle)

{

     FILE *f1

     double i,j,dx,dy,dfr,x,y,ang,step,f = 0.01

     int flag,tempx,tempy,statex,statey,direction 空慎= 1

dfr = sqrt((dfrx - dfx0) * (dfrx - dfx0) + (dfry - dfy0) * (dfry - dfy0))

       if(dfx0 == 0)

        {

         dfx0 = 1

         dfrx = dfrx + 1

         statex =1

        }

      if(dfy0 == 0)

        {

         dfy0 = 1

         dfry = dfry + 1

         statey =1

        }

     dfrx = 2 * dfx0   - dfrx

     i = dfx0 - dfrx

     j = dfy0 - dfry

     x = dfx0 

     y = dfy0 

     step = ang = 180 * 2 * asin(f/(2*dfr))/3.1415926

     if(((dfx0 > 0) && (dfy0 > 0)) || ((dfx0 < 0) && (dfy0 < 0)))

          {

           flag = direction

          }

     if(((dfx0 < 0) && (dfy0 > 0)) || ((dfx0 > 0) && (dfy0 < 0)))

          {

           flag = -direction

          }

     f1=fopen("c:\\c.txt","w+")

     if(statex ==1)

       {

     蠢启    x = x - 1

       }

     if(statey ==1)

       {

         y = y - 1

       }

     fprintf(f1,"%f,",x)

     fprintf(f1,"%f\n",y)

     while(ang < angle)

          {

           dx = f * (j + flag*(f * i)/(2 * dfr))/dfr

           dy = f * (i - flag*(f * j)/(2 * dfr))/dfr

           tempx = symbol(x)

           tempy = symbol(y)

           x = x + dx

           y = y + dy

          fprintf(f1,"%f,",x)

          fprintf(f1,"%f\n",y)

          if( (tempx !=symbol(x)) ||   (tempy != symbol(y)) )

            {

              flag = -flag

            }

          i = i - dx

          j = j + dy

          ang = ang + step

          }

     return 0

}

int symbol(double number)

{

if(number > 0)

    {

     return 1

    }

else

    {

    return -1

    }

}

数字积分法(DDA)插补直线参考程序

Sub 插补X()

标志X = 0

If 余数X >= Q Then

余数X = 余数X Mod Q

x动点 = x动点 + 1: 标志X = 1

End If

End Sub

Sub 插补Y()

标志Y = 0

If 余数Y >= Q Then

余数Y = 余数Y Mod Q

y动点 = y动点 + 1: 标志Y = 1

End If

End Sub

Sub 插补Z()

标志Z = 0

If 余数Z >= Q Then

余数Z = 余数Z Mod Q

z动点 = z动点 + 1: 标志Z = 1

End If

End Sub

Sub 插补公共()

余数X = 余数X + x终点

余数Y = 余数Y + y终点

余数Z = 余数Z + z终点

插补X

插补Y

插补Z

插补记录 = 插补记录 + 1

End Sub

Sub 插补春告()

Dim c As Integer

插补记录 = 0: 余数X = 0: 余数Y = 0: 余数Z = 0: 划轮廓线

PSet (z原点, x原点), vbRed

Select Case 象限标志

Case 1: '第一象限插补

Do Until 插早乱补记录 = Q

插补公共

Line -Step(z步长 × 标志Z, x步长 × 标志X), vbRed

Loop

Case 2: '第二象限插补

c = x终点: x终点 = z终点: z终点 = -c

c = x步长: x步长 = z步长: z步长 = -c

Do Until 插补记录 = Q

插补陆森档公共

Line -Step(x步长 × 标志X, z步长 × 标志Z), vbRed

Loop

Case 3: '第三象限插补

x终点 = -x终点: z终点 = -z终点

x步长 = -x步长: z步长 = -z步长

Do Until 插补记录 = Q

插补公共

Line -Step(z步长 × 标志Z, x步长 × 标志X), vbRed

Loop

Case 4: '第四象限插补

c = x终点: x终点 = -z终点: z终点 = c

c = x步长: x步长 = -z步长: z步长 = c

Do Until 插补记录 = Q

插补公共

Line -Step(x步长 × 标志X, z步长 × 标志Z), vbRed

Loop

End Select

End Sub

===========================================

逐点比较法圆弧插补VB程序

Sub 偏差计算()

偏差 = Sqr((x动点 - x圆心) 2 + (z动点 - z圆心) 2) - R

End Sub

Sub 插补()

x动点 = x起点: z动点 = z起点:

动点象限判别

xx: Select Case 象限标志

Case 1: 单步连续判断

If 顺逆标志 = "顺" Then'第一象限插补

Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0

If 偏差 >= 0 Then

x动点 = x动点 - 1:

Line -Step(0, -x步长), vbRed

Else

z动点 = z动点 + 1:

Line -Step(z步长, 0), vbRed

End If

偏差计算

动点象限判别

If 象限标志 <>1 Then

GoTo xx

End If

单步连续判断

Loop

ElseIf 顺逆标志 = "逆" Then

Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0

If 偏差 >= 0 Then

z动点 = z动点 - 1:

Line -Step(-z步长, 0), vbRed

Else

x动点 = x动点 + 1:

Line -Step(0, x步长), vbRed

End If

DoEvents

偏差计算

动点象限判别

If 象限标志 <>1 Then

GoTo xx

End If

Loop

End If

Case 2: 单步连续判断

If 顺逆标志 = "顺" Then'第二象限插补

Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0

If 偏差 >= 0 Then

z动点 = z动点 - 1:

Line -Step(-z步长, 0), vbRed

Else

x动点 = x动点 - 1:

Line -Step(0, -x步长), vbRed

End If

偏差计算

动点象限判别

If 象限标志 <>2 Then

GoTo xx

End If

Loop

ElseIf 顺逆标志 = "逆" Then

Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0

If 偏差 >= 0 Then

x动点 = x动点 + 1:

Line -Step(0, x步长), vbRed

Else

z动点 = z动点 + 1:

Line -Step(z步长, 0), vbRed

End If

偏差计算

动点象限判别

If 象限标志 <>2 Then

GoTo xx

End If

Loop

End If

Case 3: 单步连续判断

If 顺逆标志 = "顺" Then'第三象限插补

Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0

If 偏差 >= 0 Then

x动点 = x动点 + 1:

Line -Step(0, x步长), vbRed

Else

z动点 = z动点 - 1:

Line -Step(-z步长, 0), vbRed

End If

DoEvents

偏差计算

动点象限判别

If 象限标志 <>3 Then

GoTo xx

End If

Loop

ElseIf 顺逆标志 = "逆" Then

Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0

If 偏差 >= 0 Then

z动点 = z动点 + 1:

Line -Step(z步长, 0), vbRed

Else

x动点 = x动点 - 1:

Line -Step(0, -x步长), vbRed

End If

偏差计算

动点象限判别

If 象限标志 <>3 Then

GoTo xx

End If

Loop

End If

Case 4: 单步连续判断

If 顺逆标志 = "顺" Then'第三象限插补

Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0

If 偏差 >= 0 Then

z动点 = z动点 + 1:

Line -Step(z步长, 0), vbRed

Else

x动点 = x动点 + 1:

Line -Step(0, x步长), vbRed

End If

偏差计算

动点象限判别

If 象限标志 <>4 Then

GoTo xx

End If

Loop

ElseIf 顺逆标志 = "逆" Then

Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0

If 偏差 >= 0 Then

x动点 = x动点 - 1:

Line -Step(0, -x步长), vbRed

Else

z动点 = z动点 - 1:

Line -Step(-z步长, 0), vbRed

End If

偏差计算

动点象限判别

If 象限标志 <>4 Then

GoTo xx

End If

Loop

End If

End Select

End Sub


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12541567.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存