python等高线图轮廓线提取_图像中提取边缘线(轮廓)(等高线)

//CSFeatureCls* pfSrc,

2 double CBufImage::GetContour2(CAnyLine*lin,3 CSFeatureCls*pfDes,4 D_RECT&frc,5 RAD_STRU_SIDES*rBuf,6 longbufLen,7 doubletraceR,8 shortknobflg)9 {10 FreeBUFFERMem();11

12 TRAN_PAR tp;13 double r=MAX_DOUBLE;14 double trecR,maxr=0;15 longcolN,rowN,pageN;16 doublecolL,rowL;17 D_DOT *lxy,*ptDot=NULL;18 long ir,ir2, rtn=0;19 longi,page,li,llen;20 unsigned char *pt,*pt1,*tmpbuf=NULL;21 D_RECT linBox1,linBox2;22 CAnyPolygon anyPolygon;23

24

25 for( i=0; i

28 if( rBuf[i].lf_r<0.0 || rBuf[i].rg_r<0.0)29 continue;30

31 //保证左右的半径不同时==0

32 if( rBuf[i].lf_r<=EPS && rBuf[i].rg_r<=EPS )33 continue;34

35 //取半径的最大值

36 if( maxr

41 //取半径的最小值

42 if( rBuf[i].lf_r>0.0 && r>rBuf[i].lf_r )43 r =rBuf[i].lf_r;44 if( rBuf[i].rg_r>0.0 && r>rBuf[i].rg_r )45 r =rBuf[i].rg_r;46 }47 maxr=0;48 //分配计算的缓冲内存

49 rtn = AllocBUFMem( frc,r,maxr,&colN,&rowN,&colL,&rowL,&ir,&pageN );50 if( rtn<=0)51 gotolistLinBufferEND;52

53 //计算每个线的判别点

54 ptDot = newD_DOT[bufLen];55 for(li = 0; li < bufLen; li++)56 {57 //rtn = pfSrc->polygon_Get( rBuf[li].i,&anyPolygon);

58 llen = lin->m_varLin.dotNum();59 lxy = (D_DOT*)(lin->m_varLin.ptXY());60

61 if(rtn<=0)62 {63 ptDot[li].x = frc.xmin - maxr*2.;64 ptDot[li].y = frc.ymin - maxr*2.;65 continue;66 }67

68 //如果是左或右buffer,则利用GetArcLabel计算相应的判别点

69 if(llen > 2)70 { //取中间点在r范围内的一点作为判别点

71 GetArcLabel( lxy[llen/2-1], lxy[llen/2], lxy[llen/2+1], r/2, ptDot[li] ); //wlcheck 2006.9.5 r-->r/2

72 }73 else

74 { //取两点平均值在r范围内的一点作为判别点

75 ptDot[li].x=(lxy[0].x + lxy[llen-1].x)/2.;76 ptDot[li].y=(lxy[0].y + lxy[llen-1].y)/2.;77

78 GetArcLabel( lxy[0], ptDot[li], lxy[1], r/2, ptDot[li] ); //wlcheck 2006.9.5 r-->r/2

79 }80 }81

82 tmpbuf = new unsigned char[colN/8+1];83

84 for( page=0; page

87 memset(m_PtMFileObj->m_ptr, 0, m_PtMFileObj->m_msize);88

89 //置偏移量

90 m_BUFxy0 =m_ORGxy0;91 m_BUFxy0.x = m_BUFxy0.x - 1/m_BUFrt;92 m_BUFxy0.y = m_BUFxy0.y + (page*(rowN-1)-1)/m_BUFrt;93

94 linBox1.xmin =m_BUFxy0.x;95 linBox1.ymin =m_BUFxy0.y;96 linBox1.xmax = m_BUFxy0.x + (colN+1)/m_BUFrt;97 linBox1.ymax = m_BUFxy0.y + (rowN+1)/m_BUFrt;98

99 m_pDrawMem->SetDrawSwitch(m_PtBUFMem,colN,rowN);100 for(li=0;liCalRect(&linBox2);103 //if( pfSrc->polygon_GetRect( rBuf[li].i, linBox2 )>0 )

104 {105 if(g_RectOverlapedDetect(&linBox1,&linBox2))106 {107 /*rtn = pfSrc->polygon_Get( rBuf[li].i,&anyPolygon);108 polygon=anyPolygon;*/

109 llen = lin->m_varLin.dotNum();110 lxy = (D_DOT*)(lin->m_varLin.ptXY());111 SetLinToMemBuf(lxy,llen,0,0,knobflg);112

113 long ldotNum=llen;114 L_DOT*pxy;115 pxy = newL_DOT[ldotNum];116 GetRegEdge2Long(lxy,ldotNum,pxy,&m_BUFxy0,m_BUFrt);117 for(int jj=0;jjLineInMem(pxy[jj].x,pxy[jj+1].x,pxy[jj].y);122 }123 else

124 {125 m_pDrawMem->LineInMem1(pxy[jj].x,pxy[jj].y,pxy[jj+1].x,pxy[jj+1].y);126 }127 //m_pDrawMem->PixelInMem(pxy[jj].x,pxy[jj].y);

128 /*m_pDrawMem->PixelInMem(pxy[jj].x-1,pxy[jj].y-1);129 m_pDrawMem->PixelInMem(pxy[jj].x-1,pxy[jj].y);130 m_pDrawMem->PixelInMem(pxy[jj].x-1,pxy[jj].y+1);131 m_pDrawMem->PixelInMem(pxy[jj].x,pxy[jj].y-1);132 m_pDrawMem->PixelInMem(pxy[jj].x,pxy[jj].y+1);133 m_pDrawMem->PixelInMem(pxy[jj].x+1,pxy[jj].y-1);134 m_pDrawMem->PixelInMem(pxy[jj].x+1,pxy[jj].y);135 m_pDrawMem->PixelInMem(pxy[jj].x+1,pxy[jj].y+1);*/

136 }137 delete[]pxy;138

139 }140 }141 }142 //将上页的顶行数据放到该页的底行中

143 if(page>0)144 {145 pt=tmpbuf;146 pt1=m_PtMFileObj->m_ptr;147 for(i=0;i

151 pt=tmpbuf;152 pt1=m_PtMFileObj->m_ptr + (rowN-1)*colN/8;153 for(i=0;i

156 //计算半径 wlcheck 2008.9.11

157 CalTraceR(traceR, r,&trecR);158 m_pTrcMem->MyTraceBinDEMForBUF(colN,rowN,colL,rowL,m_PtBUFMem,trecR,pfDes);159

160 //图形平移

161 tp.type[0]=TRAN_MOVE;162 tp.type[1]=TRAN_NULL;163 tp.type[2]=TRAN_NULL;164 tp.move.dx=m_BUFxy0.x;165 tp.move.dy=m_BUFxy0.y;166

167 rtn = Transform( pfDes,&tp );168 }169

170 /***************************************************************************171 将追踪获得的点坐标不直接组织成折线要素,172 而是沿着源折线的方向投影排序(以落在折线某段上最近的垂足为排序依据),173 然后将该垂足点在折线上的归一化参数化坐标【0-1】为排序键174 然后按各点在原折线上对应位序依次顺序组织成新折线。175 并将点替换成垂足。176 //lin177 ****************************************************************************/

178 {179 intj;180 D_DOT*pt;181 D_3DOT tmppnt;182 vectorlst;183 long fNum = pfDes->GetObjCount();184 CAnyLine tmpLin;185 doubletotalLen;186 totalLen=_CalculateLength((D_DOT*)(lin->m_varLin.ptXY()),lin->m_varLin.dotNum());187

188 for(i=1;i<=fNum;i++)189 {190 pfDes->line_Get(i,&tmpLin);191 pt=(D_DOT*)(tmpLin.m_varLin.ptXY());192

193 for(j=0;j

202 long len=lst.size();203

204 D_3DOT* sortBuf = newD_3DOT[len];205 D_DOT* newDots = new D_DOT[len+2];206 long pnum=0;207

208 for(i=0;i

215 newDots[0]=((D_DOT*)lin->m_varLin.ptXY())[0];216 pnum++;217 qsort(sortBuf,len,sizeof(D_3DOT),PD_3DOTCompare);218 long prev=0;219 if(sortBuf[prev].z>0&&sortBuf[prev].z<1)220 {221 newDots[pnum].x=sortBuf[prev].x;222 newDots[pnum].y=sortBuf[prev].y;223 pnum++;224 }225 for(i=1;isortBuf[prev].z)228 {229 if(sortBuf[i].z>0&&sortBuf[i].z<1)230 {231 newDots[pnum].x=sortBuf[i].x;232 newDots[pnum].y=sortBuf[i].y;233 pnum++;234 }235

236 prev=i;237 }238 }239

240 newDots[pnum]=((D_DOT*)lin->m_varLin.ptXY())[lin->m_varLin.dotNum()-1];241 pnum++;242

243

244 delete[] sortBuf;245

246 //sort,去重复247 //248 tmpLin.m_varLin.Set(newDots,pnum,2);249 //存储

250 pfDes->cls_Clear();251 pfDes->line_Append(&tmpLin);252 delete[] newDots;253 lst.clear();254 }255 //重新计算要素类的最大外包矩形框

256 rtn =sfcls_ReCalcRange(pfDes);257 if( rtn<=0)258 gotolistLinBufferEND;259

260

261

262

263 listLinBufferEND:264

265 if(tmpbuf) delete[] tmpbuf;266 if(ptDot) delete[] ptDot;267

268 returnrtn;269 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue中,可以通过v-for指令和响应式数据来实现动态表格行的新增。以下是一种实现方式: 首先,在Vue组件的data选项中定义一个数组(比如叫做tableData),用于存储表格的数据。这个数组的初始值可以为空,也可以包含一些默认的表格行数据。 然后,在template中,使用v-for指令遍历tableData数组,将每个元素渲染成表格的一行。例如: ```html <table> <tr v-for="item in tableData" :key="item.id"> <td>{{ item.name }}</td> <td>{{ item.age }}</td> <!-- 其他列的数据 --> </tr> </table> ``` 接下来,当需要新增表格行时,可以通过点击按钮或其他交互方式来触发一个方法(比如叫做addTableRow),在这个方法中向tableData数组中添加一个新的行数据。例如: ```html <button @click="addTableRow">新增表格行</button> ... methods: { addTableRow() { // 创建一个新的行数据对象 const newTableRow = { id: this.tableData.length + 1, name: '', age: 0, // 其他列的数据 }; // 向tableData数组添加新的行数据 this.tableData.push(newTableRow); } } ``` 在上述代码中,addTableRow方法会创建一个新的行数据对象,并将其添加到tableData数组中。由于tableData是响应式的,所以当数组发生变化时,表格的视图会自动更新,新增的行会被渲染出来。 以上就是使用Vue实现动态表格新增的一个简单示例。当点击新增按钮时,会动态地添加一行空白的表格行。你可以根据实际需求来修改和扩展这个示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值