1,主要思想:对于角边过长的角点,平滑偏差太大,为保证误差,在角点的两条边上添加点,可以有效的控制精度,添加点到该角点的长度,取决于该角点的角度。修改后效果大幅度提升。
*求角点--方法3--求当前点角度---先平滑轮廓后均分轮廓--添加第二对角点
dev_update_off ()
dev_update_time ('off')
count_seconds (Seconds)
MaxCha:=0.01
JunV:=0.1
count_obj (Contours, Number)
x:=[]
y:=[]
* dev_update_on ()
limAng:=140
*所有角度
ang_re:=[]
*单个轮廓角点下标
indexics:=[]
*设定边长--角点角度100--limAng之间其中两个边任意一边长度小于该值则平滑
dispp:=1
*添加第二组点限定值
dispp1:=5
*是否是闭合轮廓标志
isclose:=0
*离散精度--添加点的距离
prece:=0.02
*平滑前后最大偏差
Maxerror:=0.0005
*平滑后轮廓
gen_empty_obj (EmptyObject2)
for Index4 := 1 to Number by 1
select_obj (Contours, ObjectSelected1, 1)
* write_contour_xld_dxf (ObjectSelected1, 'C:/Users/zysk/Desktop/测试')
length_xld (ObjectSelected1, Length)
get_contour_xld (ObjectSelected1, Row2, Col2)
if (Row2[0]==Row2[|Row2|-1]and(Col2[0]==Col2[|Col2|-1]))
isclose:=1
else
isclose:=0
endif
if (|Row2|<=2)
concat_obj (EmptyObject2, ObjectSelected1, EmptyObject2)
continue
endif
*尖角下标
indexics:=[]
*所有角度
ang_re:=[]
*加入点个数
m_indexnum:=0
*添加后的点坐标
Row:=[]
Col:=[]
for Index1 := 0 to |Row2|-2 by 1
if (Index1==0)
angle_ll (Row2[Index1], Col2[Index1], Row2[Index1+1], Col2[Index1+1], \
Row2[Index1], Col2[Index1], Row2[|Row2|-2], Col2[|Row2|-2], ang1)
* gen_cross_contour_xld (Cross, Row2[|Row2|-1], Col2[|Row2|-1], 0.5, 0)
* gen_contour_polygon_xld (Contour6, [Row2[Index1], Row2[Index1+1]], [Col2[Index1], Col2[Index1+1]])
else
angle_ll (Row2[Index1], Col2[Index1], Row2[Index1+1], Col2[Index1+1], \
Row2[Index1], Col2[Index1], Row2[Index1-1], Col2[Index1-1], ang1)
endif
if ((Index1==0)or(Index1==|Row2|-1))
if (isclose)
else
ang1:=3.14
endif
endif
gen_cross_contour_xld (Cross, Row2[Index1], Col2[Index1], 0.5, 0)
ang:=deg(ang1)
ang_re:=[ang_re,ang]
Isadd:=0
if ((0<=abs(ang))and(abs(ang)<=100))
Isadd:=1
*当线长小于设定值时,去掉该点
elseif ((100<abs(ang))and(abs(ang)<limAng))
prece:=0.01
if (Index1==0)
distance_pp (Row2[Index1], Col2[Index1], Row2[Index1+1], \
Col2[Index1+1], Dis1)
distance_pp (Row2[Index1], Col2[Index1], Row2[|Row2|-2], \
Col2[|Row2|-2], Dis2)
if ((Dis1>dispp)and(Dis2>dispp))
Isadd:=1
else
*判断是否需要添加点------需要修改,角点任意一边长大于dispp1需要添加第二组点
dislim:=prece/cos(abs(ang1*0.5))
if (Dis2*0.5>dislim)
mCos:=(Col2[|Row2|-2]-Col2[Index1])/Dis2
mSin:=(Row2[|Row2|-2]-Row2[Index1])/Dis2
addx:=Col2[Index1]+mCos*dislim
addy:=Row2[Index1]+mSin*dislim
tuple_insert (Col2, |Row2|-1, addx, Col)
tuple_insert (Row2, |Row2|-1, addy, Row)
*
gen_cross_contour_xld (Cross, addy, addx, 0.05, 0)
gen_cross_contour_xld (Cross, Row, Col, 0.05, 0)
gen_contour_polygon_xld (Contour5, Row, Col)
endif
if (Dis1*0.5>dislim)
mCos:=(Col2[Index1+1]-Col2[Index1])/Dis1
mSin:=(Row2[Index1+1]-Row2[Index1])/Dis1
addx:=Col2[Index1]+mCos*dislim
addy:=Row2[Index1]+mSin*dislim
if (Col==[])
tuple_insert (Col2, 1, addx, Col)
tuple_insert (Row2, 1, addy, Row)
m_indexnum:=m_indexnum+1
else
tuple_insert (Col, 1, addx, Col)
tuple_insert (Row, 1, addy, Row)
m_indexnum:=m_indexnum+1
endif
gen_cross_contour_xld (Cross, addy, addx, 0.05, 0)
gen_cross_contour_xld (Cross, Row, Col, 0.05, 0)
gen_contour_polygon_xld (Contour5, Row, Col)
endif
*第二组点
if ((Dis2>dispp1)or(Dis1>dispp1))
if (Dis2>dislim*2)
mCos:=(Col2[|Row2|-2]-Col2[Index1])/Dis2
mSin:=(Row2[|Row2|-2]-Row2[Index1])/Dis2
addx:=Col2[Index1]+mCos*dislim*2
addy:=Row2[Index1]+mSin*dislim*2
tuple_insert (Col, |Col|-2, addx, Col)
tuple_insert (Row, |Row|-2, addy, Row)
* m_indexnum:=m_indexnum+1
endif
if (Dis1>dislim*2)
mCos:=(Col2[Index1+1]-Col2[Index1])/Dis1
mSin:=(Row2[Index1+1]-Row2[Index1])/Dis1
addx:=Col2[Index1]+mCos*dislim*2
addy:=Row2[Index1]+mSin*dislim*2
if (Col==[])
tuple_insert (Col2, 1, addx, Col)
tuple_insert (Row2, 1, addy, Row)
m_indexnum:=m_indexnum+1
else
tuple_insert (Col, 2, addx, Col)
tuple_insert (Row, 2, addy, Row)
m_indexnum:=m_indexnum+1
endif
gen_cross_contour_xld (Cross, addy, addx, 0.05, 0)
gen_cross_contour_xld (Cross, Row, Col, 0.05, 0)
* gen_contour_polygon_xld (Contour5, Row, Col)
endif
endif
endif
else
distance_pp (Row2[Index1], Col2[Index1], Row2[Index1+1],\
Col2[Index1+1], Dis1)
distance_pp (Row2[Index1], Col2[Index1], Row2[Index1-1], \
Col2[Index1-1], Dis2)
if ((Dis1>dispp)and(Dis2>dispp))
Isadd:=1
else
*判断是否需要添加点
dislim:=prece/cos(abs(ang1*0.5))
if (Dis2*0.5>dislim)
mCos:=(Col2[Index1-1]-Col2[Index1])/Dis2
mSin:=(Row2[Index1-1]-Row2[Index1])/Dis2
addx:=Col2[Index1]+mCos*dislim
addy:=Row2[Index1]+mSin*dislim
if (Col==[])
tuple_insert (Col2, Index1+m_indexnum, addx, Col)
tuple_insert (Row2, Index1+m_indexnum, addy, Row)
m_indexnum:=m_indexnum+1
else
tuple_insert (Col, Index1+m_indexnum, addx, Col)
tuple_insert (Row, Index1+m_indexnum, addy, Row)
m_indexnum:=m_indexnum+1
endif
* gen_cross_contour_xld (Cross, addy, addx, 0.05, 0)
* gen_cross_contour_xld (Cross, Row, Col, 0.05, 0)
* gen_contour_polygon_xld (Contour5, Row, Col)
endif
if (Dis1*0.5>dislim)
mCos:=(Col2[Index1+1]-Col2[Index1])/Dis1
mSin:=(Row2[Index1+1]-Row2[Index1])/Dis1
addx:=Col2[Index1]+mCos*dislim
addy:=Row2[Index1]+mSin*dislim
if (Col==[])
tuple_insert (Col2, Index1+m_indexnum+1, addx, Col)
tuple_insert (Row2, Index1+m_indexnum+1, addy, Row)
m_indexnum:=m_indexnum+1
else
tuple_insert (Col, Index1+m_indexnum+1, addx, Col)
tuple_insert (Row, Index1+m_indexnum+1, addy, Row)
m_indexnum:=m_indexnum+1
endif
* gen_cross_contour_xld (Cross, addy, addx, 0.05, 0)
* gen_cross_contour_xld (Cross, Row, Col, 0.05, 0)
* gen_contour_polygon_xld (Contour5, Row, Col)
endif
*第二组点
if ((Dis2>dispp1)or(Dis1>dispp1))
if (Dis2>dislim*2)
mCos:=(Col2[Index1-1]-Col2[Index1])/Dis2
mSin:=(Row2[Index1-1]-Row2[Index1])/Dis2
addx:=Col2[Index1]+mCos*dislim*2
addy:=Row2[Index1]+mSin*dislim*2
tuple_insert (Col, Index1+m_indexnum-2, addx, Col)
tuple_insert (Row, Index1+m_indexnum-2, addy, Row)
m_indexnum:=m_indexnum+1
* gen_cross_contour_xld (Cross, addy, addx, 0.05, 0)
* gen_cross_contour_xld (Cross, Row, Col, 0.05, 0)
* gen_contour_polygon_xld (Contour5, Row, Col)
endif
if (Dis1>dislim*2)
mCos:=(Col2[Index1+1]-Col2[Index1])/Dis1
mSin:=(Row2[Index1+1]-Row2[Index1])/Dis1
addx:=Col2[Index1]+mCos*dislim*2
addy:=Row2[Index1]+mSin*dislim*2
if (Col==[])
tuple_insert (Col2, Index1+m_indexnum+1, addx, Col)
tuple_insert (Row2, Index1+m_indexnum+1, addy, Row)
m_indexnum:=m_indexnum+1
else
tuple_insert (Col, Index1+m_indexnum+1, addx, Col)
tuple_insert (Row, Index1+m_indexnum+1, addy, Row)
m_indexnum:=m_indexnum+1
endif
* m_indexnums:=m_indexnums+1
* gen_cross_contour_xld (Cross, addy, addx, 0.05, 0)
* gen_cross_contour_xld (Cross, Row, Col, 0.05, 0)
* gen_contour_polygon_xld (Contour5, Row, Col)
endif
endif
endif
endif
elseif ((limAng<=abs(ang))and(abs(ang)<175))
prece:=0.02
* gen_cross_contour_xld (Cross, Row2[Index1], Col2[Index1], 0.08, 0)
if (Index1==0)
distance_pp (Row2[Index1], Col2[Index1], Row2[Index1+1], \
Col2[Index1+1], Dis1)
distance_pp (Row2[Index1], Col2[Index1], Row2[|Row2|-2], \
Col2[|Row2|-2], Dis2)
*判断是否需要添加点
dislim:=prece/cos(abs(ang1*0.5))
if (Dis2*0.5>dislim)
mCos:=(Col2[|Row2|-2]-Col2[Index1])/Dis2
mSin:=(Row2[|Row2|-2]-Row2[Index1])/Dis2
addx:=Col2[Index1]+mCos*dislim
addy:=Row2[Index1]+mSin*dislim
tuple_insert (Col2, |Row2|-1, addx, Col)
tuple_insert (Row2, |Row2|-1, addy, Row)
* gen_cross_contour_xld (Cross, addy, addx, 0.05, 0)
* gen_cross_contour_xld (Cross, Row, Col, 0.05, 0)
* gen_contour_polygon_xld (Contour5, Row, Col)
endif
if (Dis1*0.5>dislim)
mCos:=(Col2[Index1+1]-Col2[Index1])/Dis1
mSin:=(Row2[Index1+1]-Row2[Index1])/Dis1
addx:=Col2[Index1]+mCos*dislim
addy:=Row2[Index1]+mSin*dislim
if (Col==[])
tuple_insert (Col2, 1, addx, Col)
tuple_insert (Row2, 1, addy, Row)
m_indexnum:=m_indexnum+1
else
tuple_insert (Col, 1, addx, Col)
tuple_insert (Row, 1, addy, Row)
m_indexnum:=m_indexnum+1
endif
* gen_cross_contour_xld (Cross, addy, addx, 0.05, 0)
* gen_cross_contour_xld (Cross, Row, Col, 0.05, 0)
* gen_contour_polygon_xld (Contour5, Row, Col)
endif
*第二组点
if ((Dis2>dispp1)or(Dis1>dispp1))
if (Dis1>2*dislim)
mCos:=(Col2[|Row2|-2]-Col2[Index1])/Dis2
mSin:=(Row2[|Row2|-2]-Row2[Index1])/Dis2
addx:=Col2[Index1]+mCos*dislim*2
addy:=Row2[Index1]+mSin*dislim*2
tuple_insert (Col, |Col|-2, addx, Col)
tuple_insert (Row, |Row|-2, addy, Row)
gen_cross_contour_xld (Cross, addy, addx, 0.05, 0)
gen_cross_contour_xld (Cross, Row, Col, 0.05, 0)
gen_contour_polygon_xld (Contour5, Row, Col)
endif
if (Dis2>2*dislim)
mCos:=(Col2[Index1+1]-Col2[Index1])/Dis1
mSin:=(Row2[Index1+1]-Row2[Index1])/Dis1
addx:=Col2[Index1]+mCos*dislim*2
addy:=Row2[Index1]+mSin*dislim*2
tuple_insert (Col, 2, addx, Col)
tuple_insert (Row, 2, addy, Row)
m_indexnum:=m_indexnum+1
endif
endif
else
distance_pp (Row2[Index1], Col2[Index1], Row2[Index1+1],\
Col2[Index1+1], Dis1)
distance_pp (Row2[Index1], Col2[Index1], Row2[Index1-1], \
Col2[Index1-1], Dis2)
*判断是否需要添加点
dislim:=prece/cos(abs(ang1*0.5))
if (Dis2*0.5>dislim)
mCos:=(Col2[Index1-1]-Col2[Index1])/Dis2
mSin:=(Row2[Index1-1]-Row2[Index1])/Dis2
addx:=Col2[Index1]+mCos*dislim
addy:=Row2[Index1]+mSin*dislim
if (Col==[])
tuple_insert (Col2, Index1+m_indexnum, addx, Col)
tuple_insert (Row2, Index1+m_indexnum, addy, Row)
m_indexnum:=m_indexnum+1
else
tuple_insert (Col, Index1+m_indexnum, addx, Col)
tuple_insert (Row, Index1+m_indexnum, addy, Row)
m_indexnum:=m_indexnum+1
endif
* gen_cross_contour_xld (Cross, addy, addx, 0.05, 0)
* gen_cross_contour_xld (Cross, Row, Col, 0.05, 0)
* gen_contour_polygon_xld (Contour5, Row, Col)
endif
if (Dis1*0.5>dislim)
mCos:=(Col2[Index1+1]-Col2[Index1])/Dis1
mSin:=(Row2[Index1+1]-Row2[Index1])/Dis1
addx:=Col2[Index1]+mCos*dislim
addy:=Row2[Index1]+mSin*dislim
if (Col==[])
tuple_insert (Col2, Index1+m_indexnum+1, addx, Col)
tuple_insert (Row2, Index1+m_indexnum+1, addy, Row)
m_indexnum:=m_indexnum+1
else
tuple_insert (Col, Index1+m_indexnum+1, addx, Col)
tuple_insert (Row, Index1+m_indexnum+1, addy, Row)
m_indexnum:=m_indexnum+1
endif
* gen_cross_contour_xld (Cross, addy, addx, 0.05, 0)
* gen_cross_contour_xld (Cross, Row[Index1+m_indexnum], Col[Index1+m_indexnum], 0.05, 0)
* gen_contour_polygon_xld (Contour5, Row, Col)
endif
*第二组点
if ((Dis2>dispp1)or(Dis1>dispp1))
if (Dis2>dislim*2)
mCos:=(Col2[Index1-1]-Col2[Index1])/Dis2
mSin:=(Row2[Index1-1]-Row2[Index1])/Dis2
addx:=Col2[Index1]+mCos*dislim*2
addy:=Row2[Index1]+mSin*dislim*2
tuple_insert (Col, Index1+m_indexnum-2, addx, Col)
tuple_insert (Row, Index1+m_indexnum-2, addy, Row)
m_indexnum:=m_indexnum+1
* gen_cross_contour_xld (Cross, addy, addx, 0.05, 0)
* gen_cross_contour_xld (Cross, Row, Col, 0.05, 0)
* gen_contour_polygon_xld (Contour5, Row, Col)
endif
if (Dis1>dislim*2)
mCos:=(Col2[Index1+1]-Col2[Index1])/Dis1
mSin:=(Row2[Index1+1]-Row2[Index1])/Dis1
addx:=Col2[Index1]+mCos*dislim*2
addy:=Row2[Index1]+mSin*dislim*2
if (Col==[])
tuple_insert (Col2, Index1+m_indexnum+1, addx, Col)
tuple_insert (Row2, Index1+m_indexnum+1, addy, Row)
m_indexnum:=m_indexnum+1
else
tuple_insert (Col, Index1+m_indexnum+1, addx, Col)
tuple_insert (Row, Index1+m_indexnum+1, addy, Row)
m_indexnum:=m_indexnum+1
endif
gen_cross_contour_xld (Cross, addy, addx, 0.05, 0)
gen_cross_contour_xld (Cross, Row[Index1+m_indexnum], Col[Index1+m_indexnum], 0.05, 0)
gen_cross_contour_xld (Cross, Row, Col, 0.05, 0)
gen_contour_polygon_xld (Contour5, Row, Col)
endif
endif
endif
endif
if (Isadd==1)
x:=[x,Col2[Index1]]
y:=[y,Row2[Index1]]
if ((0<=abs(ang))and(abs(ang)<=100))
indexics:=[indexics,Index1+m_indexnum]
else
if (|indexics|>0)
if (Index1-indexics[|indexics|-1]==1)
distance_pp (Row2[Index1], Col2[Index1], Row2[Index1-1],\
Col2[Index1-1], Dis1)
if (Dis1>dispp)
indexics:=[indexics,Index1+m_indexnum]
else
if (abs(ang_re[Index1]<abs(ang_re[Index1-1])))
indexics[|indexics|-1]:=Index1
endif
endif
else
indexics:=[indexics,Index1+m_indexnum]
endif
else
indexics:=[indexics,Index1+m_indexnum]
endif
endif
endif
endfor
* continue
*平滑等级
* degree:=0.1
* gen_cross_contour_xld (Cross, y, x, 0.05, 0)
*角点
gen_cross_contour_xld (Cross, Row[indexics], Col[indexics], 0.5, 0)
*原坐标
* gen_cross_contour_xld (Cross, Row2, Col2, 0.5, 0)
* 添加后坐标
gen_cross_contour_xld (Cross, Row, Col, 0.05, 0)
gen_contour_polygon_xld (Contour, Row, Col)
* read_tuple ('C:/Users/zysk/Desktop/hv_m_delIndex.tup', Tuple)
if (Row!=[])
Row2:=Row
Col2:=Col
endif
*生成需要平滑轮廓并处理
if (|indexics|<=1)
isok:=1
if (|indexics|==1and(isclose==0))
isok:=0
endif
else
isok:=0
endif
*平滑后的轮廓点坐标and(isclose)
if (isok)
**没有角点的轮廓
if ((|indexics|==1))
if (indexics[0]!=0)
m_Row:=[]
m_Col:=[]
wight:=[]
tuple_gen_sequence (0, indexics[0], 1, Sequence)
m_Row:=[m_Row,Row2[Sequence]]
m_Col:=[m_Col,Col2[Sequence]]
tuple_gen_sequence (indexics[0], |Row2|-2, 1, Sequence)
m_Row:=[Row2[indexics[0]]+0.000001,Row2[Sequence],m_Row]
m_Col:=[Col2[indexics[0]]+0.000001,Col2[Sequence],m_Col]
m_degree:=round(|m_Row|*0.05)
if (m_degree<2)
m_degree:= 2
endif
gen_contour_nurbs_xld (Contour, m_Row,m_Col, 'auto',\
'auto',m_degree , Maxerror, 'omit')
get_contour_xld (Contour, Row4, Col4)
else
m_degree:=round(|Row2|*0.05)
if (m_degree<2)
m_degree:= 2
endif
gen_contour_nurbs_xld (Contour, Row2, Col2, 'auto',\
'auto', m_degree , Maxerror , 'omit')
get_contour_xld (Contour, Row4, Col4)
endif
else
m_degree:=round(|Row2|*0.05)
if (m_degree<2)
m_degree:= 2
endif
gen_contour_nurbs_xld (Contour, Row2, Col2, 'auto',\
'auto', m_degree , Maxerror , 'omit')
get_contour_xld (Contour, Row4, Col4)
endif
* write_contour_xld_dxf (Contour, 'C:/Users/zysk/Desktop/2.dxf')
gen_cross_contour_xld (Cross, Row4, Col4, 0.1, 0)
concat_obj (EmptyObject2, Contour, EmptyObject2)
continue
endif
one_R:=[]
one_C:=[]
for Index6 := 0 to |indexics| by 1
if (Index6==|indexics|)
if(isclose)
break
else
tuple_gen_sequence (indexics[|indexics|-1], |Row2|-1, 1, Sequence2)
gen_cross_contour_xld (Cross, Row2[0], Col2[0], 0.5, 0)
endif
else
if (indexics[0]!=0and(Index6==0))
if (Row2[0]==Row2[|Row2|-1]and(Col2[0]==Col2[|Col2|-1]))
tuple_gen_sequence (indexics[|indexics|-1], |Row2|-1, 1, Sequence2)
tuple_gen_sequence (1, indexics[0], 1, Sequence3)
tuple_concat (Sequence2, Sequence3, Sequence2)
* gen_contour_polygon_xld (Contour3, Row2[Sequence2], Col2[Sequence2])
else
tuple_gen_sequence (0, indexics[0], 1, Sequence2)
endif
else
if (indexics[0]!=0)
tuple_gen_sequence (indexics[Index6-1], indexics[Index6], 1, Sequence2)
else
if (Index6==|indexics|-1)
tuple_gen_sequence (indexics[Index6], |Row2|-1, 1, Sequence2)
else
tuple_gen_sequence (indexics[Index6], indexics[Index6+1], 1, Sequence2)
endif
endif
* gen_cross_contour_xld (Cross, Row2[0], Col2[0], 0.05, 0)
endif
endif
if (|Sequence2|<=2)
one_R:=[one_R,Row2[Sequence2]]
one_C:=[one_C,Col2[Sequence2]]
gen_cross_contour_xld (Cross, one_R, one_C, 0.05, 0)
continue
endif
if (|Sequence2|==3)
wight:=[0.1,0.9,0.1]
gen_contour_nurbs_xld (Contour, Row2[Sequence2], Col2[Sequence2], \
'auto', wight, 2, Maxerror,'omit')
gen_cross_contour_xld (Cross, Row2[Sequence2], Col2[Sequence2], 0.5, 0)
else
m_degree:=round(|Sequence2|*0.1)
if (m_degree>|Sequence2|-1)
m_degree:=|Sequence2|-1
endif
if (m_degree<2)
m_degree:= 2
endif
if (m_degree>20)
m_degree:=20
endif
* gen_contour_polygon_xld (Contour6, Row2[Sequence2], Col2[Sequence2])
* a:=int((Length/|Row2|)*10)
* m_degree:=min([m_degree,a])
gen_contour_nurbs_xld (Contour, Row2[Sequence2], Col2[Sequence2], \
'auto', 'auto',7, Maxerror,'omit')
endif
get_contour_xld (Contour, Row, Col)
* gen_cross_contour_xld (Cross, Row2[Sequence2], Col2[Sequence2], 0.05, 0)
* gen_cross_contour_xld (Cross, Row4, Col4, 0.05, 0)
one_R:=[one_R,Row]
one_C:=[one_C,Col]
endfor
gen_cross_contour_xld (Cross, one_R, one_C, 0.05, 0)
gen_contour_polygon_xld (Contour3, one_R, one_C)
concat_obj (EmptyObject2, Contour3, EmptyObject2)
* get_contour_angle_xld (Contour3, 'abs', 'range', 2, Angles)
* stop ()
endfor
count_seconds (Seconds1)
time:=Seconds1-Seconds
gen_cross_contour_xld (Cross, y, x, 0.5, 0)
dev_display (Contours)
dev_display (Cross)
stop ()
2,平滑效果: