您的位置:首页 > 其它

PCB 板边倒圆角的实现方法(基本算法一)

2019-07-15 00:56 2835 查看

当PCB外形是直角时,通常工程制作外形(锣带)时,会将直角或尖角的地方倒成圆角,主要是为了防止板边容易划伤板且容易扎伤人

所以当客户没有特殊要求时,PCB外形是直角一般会默认倒角0.5mm圆角(如下图所示)

/// <summary>
/// Surface 坐标泛型集类1
/// </summary>
public class gSur_Point
{
public gSur_Point()
{ }
public gSur_Point(double x_val, double y_val, byte type_point_)
{
this.p.x = x_val;
this.p.y = y_val;
this.type_point = type_point_;
}
public gSur_Point(gPoint p, byte type_point_)
{
this.p = p;
this.type_point = type_point_;
}
public gPoint p;
/// <summary>
/// 0为折点  1为顺时针 2为逆时针
/// </summary>
public byte type_point { get; set; } = 0;
/// <summary>
/// 值
/// </summary>
public double Value { get; set; } = 0;
/// <summary>
/// 角度
/// </summary>
public double Angle { get; set; } = 0;
/// <summary>
/// 标记
/// </summary>
public bool isFalg { get; set; }
}
/// <summary>
/// 点  数据类型 (XY)
/// </summary>
public struct gPoint
{
public gPoint(gPoint p_)
{
this.x = p_.x;
this.y = p_.y;
}
public gPoint(double x_val, double y_val)
{
this.x = x_val;
this.y = y_val;
}
public double x;
public double y;
public static gPoint operator +(gPoint p1, gPoint p2)
{
p1.x += p2.x;
p1.y += p2.y;
return p1;
}
public static gPoint operator -(gPoint p1, gPoint p2)
{
p1.x -= p2.x;
p1.y -= p2.y;
return p1;
}
public static gPoint operator +(gPoint p1, double val)
{
p1.x += val;
p1.y += val;
return p1;
}
public static bool operator ==(gPoint p1, gPoint p2)
{
return (p1.x == p2.x && p1.y == p2.y);
}
public static bool operator !=(gPoint p1, gPoint p2)
{
return !(p1.x == p2.x && p1.y == p2.y);
}
}
/// <summary>
/// 求叉积   判断【点P与线L】位置关系【小于0】在右边   【大于0】在左边   【等于0】共线
/// </summary>
/// <param name="ps"></param>
/// <param name="pe"></param>
/// <param name="p"></param>
/// <returns>【小于0】在右边   【大于0】在左边   【等于0】共线</returns>
public double multi(gPoint ps, gPoint pe, gPoint p)
{
return ((ps.x - p.x) * (pe.y - p.y) - (pe.x - p.x) * (ps.y - p.y));
}
/// <summary>
/// 检测 Surface是否逆时针
/// </summary>
/// <param name="gSur_Point_list"></param>
/// <returns></returns>
public bool s_isCCW(List<gSur_Point> gSur_Point_list)
{
double d = 0;
int n = gSur_Point_list.Count() - 1;
for (int i = 0; i < n; i++)
{
if (gSur_Point_list[i].type_point > 0) continue;
int NextI = i + 1 + (gSur_Point_list[i + 1].type_point > 0 ? 1 : 0);
d += -0.5 * (gSur_Point_list[NextI].p.y + gSur_Point_list[i].p.y) * (gSur_Point_list[NextI].p.x - gSur_Point_list[i].p.x);
}
return d > 0;
}
/// <summary>
/// 返回两点之间欧氏距离
/// </summary>
/// <param name="p1"></param>
/// <param name="p2"></param>
/// <returns></returns>
public double p2p_di(gPoint p1, gPoint p2)
{
return Math.Sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
/// <summary>
/// 求方位角
/// </summary>
/// <param name="ps"></param>
/// <param name="pe"></param>
/// <returns></returns>
public double p_ang(gPoint ps, gPoint pe)
{
double a_ang = Math.Atan((pe.y - ps.y) / (pe.x - ps.x)) / Math.PI * 180;
//象限角  转方位角   计算所属象限   并求得方位角
if (pe.x >= ps.x && pe.y >= ps.y)  //↗    第一象限
{
return a_ang;
}
else if (!(pe.x >= ps.x) && pe.y >= ps.y)  // ↖   第二象限
{
return a_ang + 180;
}
else if (!(pe.x >= ps.x) && !(pe.y >= ps.y))  //↙   第三象限
{
return a_ang + 180;
}
else if (pe.x >= ps.x && !(pe.y >= ps.y))  // ↘   第四象限
{
return a_ang + 360;
}
else
{
return a_ang;
}
}
View Code  三.板边凸点倒圆角方法      方法一.也最简单的倒角方法,我们将PCB板边凸点找出来后,可以直接借助genesis倒角功能就可以实现了

                   当然但偶尔会报错的, 且当N个小线段组成的尖角倒角会出错(要实现完美效果只有自己写倒角算法啦)             

             

   方法二:自己写倒角算法,这个算法和加内角孔算法类似(这里只是介绍简单的倒角)考虑特殊的需要扩展

         可以参考这篇文章: https://www.cnblogs.com/pcbren/p/9665304.html

            

 四.凸点加倒圆角实现效果   

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: