當前位置:首頁 » 編程語言 » c語言圓弧插補演算法
擴展閱讀
neo4j圖形資料庫 2022-11-27 00:37:49
存儲設備和大數據有關嗎 2022-11-27 00:36:53

c語言圓弧插補演算法

發布時間: 2022-10-03 10:27:54

Ⅰ 誰有用c語言編寫的直線,圓弧插補程序

/*************************************************************************
Function:intArcXY(doubledfx0,doubledfy0,doubledfrx,
doubledfry,intangle);
Description:在X-Y軸所構成的平面上,以圓弧運動的方式從目前位置經過指
定的參考點到目的點。調用此函數成功將增加運動命令的庫存數目。
Parameters:dfx0,dfy0參考點的X-Y軸座標值
dfrx,dfry圓心的X-Y軸座標值
angle插補角度
Calls:無
ReturnValue:大於或等於0給予此運動命令的編碼
小於0失敗,傳回值的意義可參考錯誤信息代碼
**************************************************************************/

#include<stdio.h>
#include<math.h>
intArcXY(doubledfx0,doubledfy0,doubledfrx,doubledfry,intangle);
intsymbol(doublenumber);

main()
{

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

}
intArcXY(doubledfx0,doubledfy0,doubledfrx,doubledfry,intangle)
{
FILE*f1;

doublei,j,dx,dy,dfr,x,y,ang,step,f=0.01;

intflag,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 ",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 ",y);

if((tempx!=symbol(x))||(tempy!=symbol(y)))
{
flag=-flag;
}

i=i-dx;
j=j+dy;
ang=ang+step;

}

return0;

}

intsymbol(doublenumber)
{
if(number>0)
{
return1;
}
else
{
return-1;
}
}

Ⅱ 怎麼用C語言畫圓弧,還有就是怎麼讓一個圓做曲線運動

用C語言畫圓弧將系統初
始化成畫圖狀態(默認的是文字狀態).然後庫函數個畫圓的函數,該函數有4個參數:圓心的位置,半徑的長度,圓弧的起始角的大小(以水平面為0度,下同)以及圓弧的終止角的大小.根據需要就可以畫出各種圓弧了
!

Ⅲ 誰有用C語言編寫的直線,圓弧插補程序

給你推薦一本書,<計算機圖形學基礎>唐澤聖,周嘉玉,李新友寫的,我們以前上課用的,上面有常用的直線和圓弧演算法,比如數值微分法生成直線,逐點比較法插補圓弧,角度DDA法產生圓弧,基本都有C語言的源程序.你可以搜搜這本書,本來都有源程序的,後來給刪掉了~~
貼一個別人的
/*************************************************************************
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;
}
}
int ArcXY(double dfx0,double dfy0,double dfrx, double dfry,int angle); 這個就是子函數,你放到你需要的地方注意參數,按自己需要修改,要麼添加返回值返回感興趣的部分,要麼添加參數按照傳引用的方法取得,直線的有簡單DDA演算法的,需要的話明天打上,今天有點晚了.

Ⅳ C語言編程

生命游戲
/* ------------------------------------------------------ */
/* PROGRAM game of life : */
/* This is a finite implementation of John H. Conway's */
/* Game of Life. Refere to my book for detail please. */
/* */
/* Copyright Ching-Kuang Shene July/25/1989 */
/* ------------------------------------------------------ */

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

#define MAXSIZE 50 /* board size */
#define OCCUPIED 1 /* occupied flag */
#define UNOCCUPIED 0
#define YES 1
#define NO 0

char cell[MAXSIZE][MAXSIZE]; /* the board */
char work[MAXSIZE][MAXSIZE]; /* a working */
int row; /* No. of rows you want */
int column; /* no. of columns you want */
int generations; /* maximum no. of generation*/

/* ------------------------------------------------------ */
/* FUNCTION read_in : */
/* This function reads in the number of generations, */
/* the number of rows, the number of columns and finally */
/* the initial configuration (the generation 0). Then put*/
/* your configuration to the center of the board. */
/* ------------------------------------------------------ */

void read_in(void)
{
int max_row, max_col; /* max # of row and col. */
int col_gap, row_gap; /* incremnet of row and col */
int i, j;
char line[100];

gets(line); /* read in gens, row and col*/
sscanf(line, "%d%d%d", &generations, &row, &column);
for (i = 0; i < row; i++)/* clear the board */
for (j = 0; j < column; j++)
cell[i][j] = UNOCCUPIED;
max_col = 0; /* read in the config. */
for (max_row = 0; gets(line) != NULL; max_row++) {
for (i = 0; line[i] != '\0'; i++)
if (line[i] != ' ')
cell[max_row][i] = OCCUPIED;
max_col = (max_col < i) ? i : max_col;
}
row_gap = (row - max_row)/2; /* the moving gap */
col_gap = (column - max_col)/2;
for (i = max_row + row_gap - 1; i >= row_gap; i--) {
for (j = max_col + col_gap - 1; j >= col_gap; j--)
cell[i][j] = cell[i-row_gap][j-col_gap];
for ( ; j >= 0; j--)
cell[i][j] = UNOCCUPIED;
}
for ( ; i >= 0; i--)
for (j = 0; j < column; j++)
cell[i][j] = UNOCCUPIED;
}

/* ------------------------------------------------------ */
/* FUNCTION display : */
/* Display the board. */
/* ------------------------------------------------------ */

#define DRAW_BOARDER(n) { int i; \
printf("\n+"); \
for (i = 0; i < n; i++) \
printf("-"); \
printf("+"); \
}
void display(int gen_no)
{
int i, j;

if (gen_no == 0)
printf("\n\nInitial Generation :\n");
else
printf("\n\nGeneration %d :\n", gen_no);

DRAW_BOARDER(column);
for (i = 0; i < row; i++) {
printf("\n|");
for (j = 0; j < column; j++)
printf("%c", (cell[i][j] == OCCUPIED) ? '*' : ' ');
printf("|");
}
DRAW_BOARDER(column);
}

/* ------------------------------------------------------ */
/* FUNCTION game_of_life : */
/* This is the main function of Game of Life. */
/* ------------------------------------------------------ */

void game_of_life(void)
{
int stable; /* stable flag */
int iter; /* iteration count */
int top, bottom, left, right; /* neighborhood bound */
int neighbors; /* # of neighbors */
int cell_count; /* # of cells count */
int done;
int i, j, p, q;

display(0); /* display initial config. */
done = NO;
for (iter = 1; iter <= generations && !done; iter++) {
memmove(work, cell, MAXSIZE*MAXSIZE); /**/
stable = YES; /* assume it is in stable */
cell_count = 0; /* # of survived cells = 0 */
for (i = 0; i < row; i++) { /* scan each cell...*/
top = (i == 0) ? 0 : i - 1;
bottom = (i == row - 1) ? row-1 : i + 1;
for (j = 0; j < column; j++) {
left = (j == 0) ? 0 : j - 1;
right = (j == column - 1) ? column-1 : j + 1;

/* compute number of neighbors */

neighbors = 0;
for (p = top; p <= bottom; p++)
for (q = left; q <= right; q++)
neighbors += work[p][q];
neighbors -= work[i][j];

/* determine life or dead */

if (work[i][j] == OCCUPIED)
if (neighbors == 2 || neighbors == 3) {
cell[i][j] = OCCUPIED;
cell_count++;
}
else
cell[i][j] = UNOCCUPIED;
else if (neighbors == 3) {
cell[i][j] = OCCUPIED;
cell_count++;
}
else
cell[i][j] = UNOCCUPIED;
stable = stable && (work[i][j] == cell[i][j]);
}
}
if (cell_count == 0) {
printf("\n\nAll cells die out.");
done = YES;
}
else if (stable) {
printf("\n\nSystem enters a stable state.");
done = YES;
}
else
display(iter);
}
}

/* ------------------------------------------------------ */

void main(void)
{
read_in();
game_of_life();
}


Ⅳ C語言繪制圓弧演算法

http://wenku..com/view/a3aa271e227916888486d77e.html

Ⅵ cnc系統的插補計算一般採用軟體插補和硬體插補相結合的辦法,即什麼'

圓弧插補目前可分為硬體圓弧插補和軟體圓弧插補;
硬體圓弧插補是指在運動控制晶元上已集成了圓弧插補演算法,無需額外用軟體演算法實現
機械手在需要兩軸或兩軸以上配合走出一條勻速直線軌跡時需要用到直線插補;
目前軟體圓弧插補的演算法也是將圓弧細分成相應數量的短直線,然後以直線插補的模式運行的

Ⅶ 簡答題何為插補常用的插補演算法有哪幾種

數控裝置根據輸入的零件程序的信息,將程序段所描述的曲線的起點、終點之間的空間進行數據密化,從而形成要求的輪廓軌跡,這種「數據密化」機能就稱為「插補」。

插補常用方法:

1、逐點比較法:由運動偏差產生信息,通過不斷比較刀具與被加工零件輪廓之間的相對位置,決定刀具的進給。

2、數據采樣法:這種方法先根據編程速度,將給定輪廓軌跡按插補周期分割為插補進給段,即用一系列首尾相連的微小線段來逼近給定曲線。

3、數字積分法:數字積分法具有運算速度快、脈沖分配均勻、易於實現多坐標聯動及描繪平面各種函數曲線的特點,應用比較廣泛。

(7)c語言圓弧插補演算法擴展閱讀

插補分類:

1、直線插補:在此方式中,兩點間的插補沿著直線的點群來逼近,沿此直線控制刀具的運動。所謂直線插補就是只能用於實際輪廓是直線的插補方式。

2、圓弧插補:圓這是一種插補方式,在此方式中,根據兩端點間的插補數字信息,計算出逼近實際圓弧的點群,控制刀具沿這些點運動,加工出圓弧曲線。

參考資料

網路-插補

網路-插補運算

Ⅷ 插補演算法模擬程序設計,c語言程序設計,求大神指點

本周該交了,加油,哈哈

Ⅸ 步進電機控制器的圓弧插補計算方法

圓弧插補的定義是給出兩端點間的插補數字信息,藉此信息控制刀具與工件的相對運動,使其按規定的圓弧加工出理想曲面的一種插補方式。它所屬的學科是機械工程,切削加工工藝與設備;自動化製造系統

圓弧插補(Circula : Interpolation)這是一種插補方式,在此方式中,根據兩端點間的插補數字信息,計算出逼近實際圓弧的點群,控制刀具沿這些點運動,加工出圓弧曲線。

X,Y軸以插補方式,通過設定的半徑R及合成的法相速度值逆時針時針方向做擬合出圓弧曲線。其中參數X,Y,表示的是圓弧終點相對於起點的坐標,R通過正負值來確定所畫曲線為劣弧(小於180°)優弧(大於180°)。

例:控制器上電,快速移動X10,Y8的位置A點,然後Z慢速向下移動-6,然後逆時針方向畫圓弧至B點,半徑為5,圓弧為整圓的1/3,然後Z向上移動6,然後X,Y回程序零。