EDA365电子论坛网

标题: 请教如何获取斜着的器件的四个顶点坐标 [打印本页]

作者: gogogo冲冲冲    时间: 2025-7-24 10:15
标题: 请教如何获取斜着的器件的四个顶点坐标




现在的思路是遍历这个器件bound的所有segments,从中找出坐标点,但是现在只能找到四个顶点坐标的其中一个值,要么X坐标,要么Y坐标,不能形成(X,Y)的坐标点

Bound_Box = Bound_Shape->bBox
Bound_Shape_Segments = Bound_Shape->segments
foreach ( seg Bound_Shape_Segments
    _ seg_bBOX = seg->bBox
    _ seg_X_list = list()
    _ seg_Y_list = list()

    _ Bound_Seg_urx = xCoord( upperRight( _seg_bBOX ))
    _ Bound_Seg_llx = xCoord( lowerLeft( _seg_bBOX ))
    _ seg_X list = cons( _Bound_Seg_urx _seg_X_list)
    _ seg_X list = cons( _Bound_Seg_llx _seg_X_list)

    _ Bound_Seg_ury = yCoord( upperRight( _seg_bBOX ))
    _ Bound_Seg_lly = yCoord( lowerLeft( _seg_bBOX ))
    _ seg_Y_list = cons( _Bound_Seg_ury _seg_Y_list)
    _ seg_Y_list = cons( _Bound_Seg_lly _seg_Y_list)

    _ Bound_Min_X = min( _seg_X_list) ; 找到了x方向上的最小点
    _ Bound_Max_X = max( _seg_X_list) ; 找到了x方向上的最大点
    _ Bound_Min_Y = min( _seg_Y_list) ; 找到了y方向上的最小点
    _ Bound_Max_Y = max( _seg_Y_list) ; 找到了y方向上的最大点


作者: db-_-    时间: 2025-7-24 12:08
没看懂图中的是pin的形状还是器件的外形?
4个顶点是形状的顶点还是box的顶点?
作者: gogogo冲冲冲    时间: 2025-7-24 12:19
db-_- 发表于 2025-07-24 12:08:20
没看懂图中的是pin的形状还是器件的外形?
4个顶点是形状的顶点还是box的顶点?


器件的外形和形状的顶点


作者: gogogo冲冲冲    时间: 2025-7-24 12:21
db-_- 发表于 2025-07-24 12:08:20
没看懂图中的是pin的形状还是器件的外形?
4个顶点是形状的顶点还是box的顶点?


想获取器件的外形形状(bound层)的4个顶点坐标



作者: athena_lu    时间: 2025-7-24 14:12
ABC是三视图?
作者: gogogo冲冲冲    时间: 2025-7-24 16:08
athena_lu 发表于 2025-07-24 14:12:53
ABC是三视图?


是不同器件的bound形状。画得抽象了一点


作者: db-_-    时间: 2025-7-24 17:22
还是没看懂,你要外形的顶点坐标,你segment都有了,把segment的startEnd提取出来就好啦。
作者: 回忆着回忆    时间: 2025-7-24 21:49
可以参考一下     pin_angle=pin_one->rotation       
                                       
                                        pin_shape_soder_0=axlCopyObject(pin_shape_soder, ?angle -pin_angle)
                               
                                        pin_shape_soder_0_box=car(pin_shape_soder_0)->bBox       


                                        minXa=car(car(pin_shape_soder_0_box))  
                                        minYa=cadr(car(pin_shape_soder_0_box))
                                        maxXa=car(cadr(pin_shape_soder_0_box))
                                        maxYa=cadr(cadr(pin_shape_soder_0_box))
                                        axlDeleteObject(car(pin_shape_soder_0))
                                        axlDeleteObject(car(pin_shape_soder))       

                                       
                                        if(get_pin_defwidth==nil then
                                                pin_thermal_width=get_thermal_width                                               
                                                pin_thermal_heigth=get_thermal_width

                                        else       
                                                pin_thermal_width = abs(minXa-pin_x)                  
                                                pin_thermal_heigth = abs(minYa-pin_y)                                       
                                               
                                       
                                        )

                                       
                                       
                                        pin_exp_shape_soder_0=axlCopyObject(pin_expand_soder, ?angle -pin_angle)
                               
                                        pin_exp_shape_soder_0_box=car(pin_exp_shape_soder_0)->bBox       


                                        minXa0=car(car(pin_exp_shape_soder_0_box))  
                                        minYa0=cadr(car(pin_exp_shape_soder_0_box))
                                        maxXa0=car(cadr(pin_exp_shape_soder_0_box))
                                        maxYa0=cadr(cadr(pin_exp_shape_soder_0_box))
                                        axlDeleteObject(car(pin_exp_shape_soder_0))
                                        axlDeleteObject(car(pin_expand_soder))               
               
                                       
                                        ;未旋转0度时PIN外扩顶点坐标                       
                                       
                                        p1xy0=list(minXa0 minYa0)
                                        p2xy0=list(maxXa0 minYa0)
                                       
                                        p3xy0=list(maxXa0 maxYa0)
                                        p4xy0=list(minXa0 maxYa0)
                                       


                                       
                                       
                                        ;旋转后的PIN外扩坐标,也就是当前PIN外扩顶点坐标                               
                                       
                                        rodians=3.14159265358979*pin_angle/180

                                        p1xy1=list((minXa0-pin_x)*cos(rodians)-(minYa0-pin_y)*sin(rodians)+pin_x  (minXa0-pin_x)*sin(rodians)+(minYa0-pin_y)*cos(rodians)+pin_y)
                                       
                                        p2xy1=list((maxXa0-pin_x)*cos(rodians)-(minYa0-pin_y)*sin(rodians)+pin_x  (maxXa0-pin_x)*sin(rodians)+(minYa0-pin_y)*cos(rodians)+pin_y)
                                       
                                        p3xy1=list((maxXa0-pin_x)*cos(rodians)-(maxYa0-pin_y)*sin(rodians)+pin_x  (maxXa0-pin_x)*sin(rodians)+(maxYa0-pin_y)*cos(rodians)+pin_y)
                                        p4xy1=list((minXa0-pin_x)*cos(rodians)-(maxYa0-pin_y)*sin(rodians)+pin_x  (minXa0-pin_x)*sin(rodians)+(maxYa0-pin_y)*cos(rodians)+pin_y)
               


                       
                                               
                                        p12xy=list((car(p1xy1)+car(p2xy1))/2  (cadr(p1xy1)+cadr(p2xy1))/2)
                                        p23xy=list((car(p2xy1)+car(p3xy1))/2  (cadr(p2xy1)+cadr(p3xy1))/2)
                                        p34xy=list((car(p3xy1)+car(p4xy1))/2  (cadr(p3xy1)+cadr(p4xy1))/2)                                       
                                        p41xy=list((car(p4xy1)+car(p1xy1))/2  (cadr(p4xy1)+cadr(p1xy1))/2)       



作者: gogogo冲冲冲    时间: 2025-7-25 12:48
db-_- 发表于 2025-07-24 17:22:53
还是没看懂,你要外形的顶点坐标,你segment都有了,把segment的startEnd提取出来就好啦。


谢谢????!startEnd还没太注意是不是就完全是起点和终点的坐标,我下来看看。要是这个segment是斜着的,这个startEnd,无法判断是左斜还是右斜



作者: gogogo冲冲冲    时间: 2025-7-25 12:49
回忆着回忆 发表于 2025-07-24 21:49:02


谢谢????!有些类似,下来参考参考


作者: 雞翅加辣    时间: 2025-7-28 15:45
沒這麼難啦~你把shape 轉成 polygon ,就可以取頂點(vertices)了。
不過抓vertices的缺點就是,如果你的shape是四邊形以上,可能就要判斷哪一個點會是你要的了!
作者: gogogo冲冲冲    时间: 2025-7-31 21:31
雞翅加辣 发表于 2025-07-28 15:45:03
沒這麼難啦~你把shape 轉成 polygon ,就可以取頂點(vertices)了。
不過抓vertices的缺點就是,如果你的shape是四邊形以上,可能就要判斷哪一個點會是你要的了!


谢谢,感谢。一个新思路






欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2