G代码圆弧_g02和g03走圆编程-程序员宅基地

技术标签: 算法  G-Code  兴趣使然  G02/G03  

圆弧总结

说明

工作中经常画图经常会遇到圆弧,开始的时候我并不是很理解,随着深入发现其实有些坑的,这里总结记录一下,可能并不是最优的解法,但肯定是自己理解后想出来的,如果这些能给你提供一些思路和帮助,那便是极好的。

G-Code的G02/G03

G02 顺时针圆弧/G03 逆时针圆弧

在这里插入图片描述

圆心的计算

I, J, K模式
G02 X20 Y10 I0 J-10
G03 X10.5 I3.0 J4.0

G02/G03指令,是已知起始点S(Xs, Ys),终止点E(Xe, Ye),相对圆心的增量(I, J),顺逆时针状态。通过这些信息我们是可以算出圆心的。

一般来说是(I, J)是圆弧起点相对圆心的增量,即圆心O坐标是(Xs + I, Ys + J)。而我遇到的情况,(I, J)的表示可能有以下几种情况:

  • 相对圆弧起点的增量
  • 相对圆弧终点的增量
  • 绝对圆弧中心
计算

这个就很简单了,针对(I, J)表示不同时计算方式也不同

  • 相对圆弧起点时,圆心坐标

O x = X s + I ; O y = Y s + J ; O_x = X_s + I;\\ O_y = Y_s + J;\\ Ox=Xs+I;Oy=Ys+J;

  • 相对圆弧终点时,圆心坐标

O x = X e + I ; O y = Y e + J ; O_x = X_e + I;\\ O_y = Y_e + J;\\ Ox=Xe+I;Oy=Ye+J;

  • 绝对圆弧中心

O x = I ; O y = J ; O_x = I;\\ O_y = J; Ox=I;Oy=J;

R模式
G02 X20 Y10 R10 F300

注意相同的起点、终点、半径和方向,计算出来的圆心可能有两种。其中,

  • R>0时,圆弧和中心的夹角小于180°,即圆弧段小于或等于半圆;
  • R<0时,圆弧和中心的夹角大于180°,即圆弧段大于半圆。

例如下图,G02指令时,如果R>0时,圆心是黑色圆的,如果R<0,则应该是黄色的圆。
在这里插入图片描述

以下图片是我画的分析用的简易图,方便自己理解如何计算出圆心的方法。假设以下是G02圆弧,起点为C,终点为D,半径为R,加粗圆弧部分是实际路径。
在这里插入图片描述

计算

假设存在上面的情况,已知起点C(Xc, Yc), 终点D(Xd, Yd),半径R

  1. 连接CD,求得中点A(Xa, Ya)

X a = ( X c + X d ) 2 Y a = ( Y c + Y d ) 2 (1) X_a = \frac{(X_c + X_d)}{2}\\ Y_a = \frac{(Y_c + Y_d)}{2} \tag{1} Xa=2(Xc+Xd)Ya=2(Yc+Yd)(1)

  1. 现在可以得到向量 A C ⃗ \vec{AC} AC 的单位向量了
    ∣ A C ⃗ ∣ = ( X a − X c ) 2 + ( Y a − Y c ) 2 A C ^ = A C ⃗ ∣ A C ⃗ ∣ (2) |\vec{AC}| = \sqrt{(X_a - X_c)^2 + (Y_a - Y_c)^2} \\ \hat{AC} = \frac{\vec{AC}}{|\vec{AC}|} \tag{2} AC =(XaXc)2+(YaYc)2 AC^=AC AC (2)

  2. 圆上两点连线的中垂线必过圆心,这是个知识点,然后根据直角三角关系,可以知道(AO)2 = R2 - (AC)2,下面用向量的方式表示,后面会用到。

∣ A O ⃗ ∣ = R 2 − ∣ A C ⃗ ∣ 2 (3) |\vec{AO}| = \sqrt{R^2 - |\vec{AC}|^2} \tag{3} AO =R2AC 2 (3)

  1. 现在只需要将单位向量 A C ^ \hat{AC} AC^,旋转90°后就是向量 A O ⃗ \vec{AO} AO 的单位向量(这个没问题吧),如果旋转-90°就是向量 A P ⃗ \vec{AP} AP 的单位向量,然后乘以AO的长度就得到圆心了,两种情况的圆心都可以认为是对的。

A O ⃗ = A O ^   ∗ ∣ A O ⃗ ∣ (4) \vec{AO} = \hat{AO}\ * |\vec{AO}|\tag{4} AO =AO^ AO (4)

R模式实际算法省略,因为经验有限,我并没有遇到过这个情况,当前仅讨论这个情况下计算出圆心的理论算法。

圆弧夹角的计算

这个地方,我感觉相对是比较麻烦的,因为必须要考虑圆弧方向,角度的值域范围,并不能简单粗暴的 终点角度 − 起点角度 终点角度- 起点角度 终点角度起点角度

#define 	PI 		3.1415926535897932384626433
#define 	EPS 	0.000001

//!< 基础点
struct Point
{
    
	double x;
    double y;
};
typedef Point Vector;

//!< 计算两向量夹角
float calc2VecAngle(const Vector& v1, const Vector& v2, const int& isCw)
{
    
    //!< atan2 计算得到的弧度范围是[-PI, PI],可以转换成[0, 2 * PI]来计算
    float startAngNew = atan2f(v1.y, v1.x);
    float startAngNew2 = atan2f(v2.y, v2.x);

    if (startAngNew < EPS)
        startAngNew += 2 * PI;
    if (startAngNew2 < EPS)
        startAngNew2 += 2 * PI;

    float sweepNew = abs(startAngNew - startAngNew2);
    if (isCw != 0)
    {
    
        //!< 两向量之间的夹角,需要根据顺/逆时针,和所处角度象限判断
        if (startAngNew < startAngNew2 && isCw > EPS ||
            startAngNew > startAngNew2 && isCw < EPS)
        {
    
            sweepNew = abs(2 * PI - abs(sweepNew));
        }
    }
    return sweepNew;
}

//!< 已知圆弧,圆心,起点,终点,方向,计算出圆弧夹角(弧度制) 
void calcArcAngle(Point center, Point s, Point e, bool isClockWise, double& angle)
{
    
    //!< 起点终点相同的情况,就是个整圆
    if (s == e)
    {
    
        angle = PI * 2;
    }
    else
    {
    
        Vector v1, v2;
        v1.x = start.x - center.x;
        v1.y = start.y - center.y;

        v2.x = end.x - center.x;
        v2.y = end.y - center.y;

        angle = calc2VecAngle(v1, v2, (cw ? 1 : -1));
    }
}

在圆弧上

上面的方法中,可以已知圆弧圆心,圆弧起点,圆弧终点,方向,是可以计算判断出某个点在不在圆弧上。

//!< 两点的距离
double getLength(const Point& p1, const Point& p2)
{
    
	return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));   
}

//!< 计算角度,需要用到atan2f值域[-π, π],这个很重要
//!< 可以转换成[0, 2π]来计算
double getAngle(const Point& p1, const Point& p2)
{
    
    double ang = atan2f((p2.y - p1.y), (p2.x - p1.x)); // [-π, π]
    if (ang < EPS) {
         // [-π, 0]
        ang += PI * 2.0f;
    }
    return ang;
}

//!< angle的取值限制为圆上的任意角度
bool isOn(const Point& center, const Point& start, const Point& end, const bool& cw, const double& angle, const double& eps)
{
    
    //!< 如果圆是个整圆,任一角度都在圆弧上
    if (start == end)
    {
    
        return true;
    }

    //[0, 2π]
    double startAng = getAngle(center, start);
    double endAng = getAngle(center, end);
    double curAng = angle;

    bool bIsOn = false;
    //!< 顺时针
    if (cw)
    {
    
        //!< 圆弧起始角度 > 终止角度的情况
        if (startAng > endAng)
        {
    
            //!< curAng 满足区间 [endAng, startAng]
            if (curAng >= endAng && curAng <= startAng)
            {
    
                bIsOn = true;
            }
        }
        //!< 圆弧起始角度 < 终止角度
        else
        {
    
            //!< 顺时针时 起始角度 < 终止角度则说明圆弧经过了0°, 则此时可以
            //!< 在两个区间判断角度, 满足任一区间即可, [endAng, 2π], [0, startAng]
            if ((curAng >= endAng && curAng <= 2*PI) ||
                (curAng >= eps && curAng <= startAng)
            {
    
                bIsOn = true;
            }
        }
    }
    //!< 逆时针
    else
    {
    
        //!< 圆弧起始角度 < 终止角度的情况
        if (startAng < endAng)
        {
    
            //!< curAng的值域在[startAng, endAng]
            if (curAng >= startAng && curAng <= endAng)
            {
    
                bIsOn = true;
            }
        }
        //!< 圆弧起始角度 > 终止角度
        else
        {
    
            //!< 逆时针时 起始角度 > 终止角度则说明圆弧经过了0°, 则此时可以
            //!< 在两个区间判断角度, 满足任一区间即可, [startAng, 2π], [0, endAng]
            if ((curAng >= startAng && curAng <= 2*PI) ||
                (curAng >= eps && curAng <= endAng)
            {
    
                bIsOn = true;
            }
        }
    }
    return bIsOn;
}

//!< 判断点是不是在圆弧上
bool isOn(const Point& center, const Point& start, const Point& end, const bool& cw, const Point& curPt, const double& eps)
{
    
    double radius = getLength(center, start);
    double len = getLength(center, pt);
    
    //!< 半径不匹配肯定是不在圆上的
    if (abs(len - radius) > eps)
        return false;

    double curAng = getAngle(m_center, pt);
	return isOn(center, start, end, cw, curAng, eps);
}

圆弧外接矩形计算

不带角度

下图中黑色圆弧为实际圆弧,黑色点为圆的四个顶点位置,绿色为需要计算的圆弧外接矩形,这个时候求圆弧外接矩形是分两种情况的:

  • 小于90°
    小于90°的圆弧

  • 大于等于90°
    大于90°的圆弧

计算
  1. 从圆的上下左右四个顶点中,找出在圆弧上的顶点
  2. 计算出已知点集的外接矩形
#define MAX_NUM  1E20
#define MIN_NUM  -1E20

//!< 外接矩形
struct rect
{
    
    float left;
    float top;
    float right;
    float bottom;
};

//!< 计算圆弧的外接矩形
rect calcRectangle(const Point& center, const Point& start, const Point& end, const bool& cw)
{
    
    rect rc;
    double radius = getLength(center, start);
    
    //!< 如果是个整圆
    if (start == end)
    {
    
        rc.left = center.x - radius;
        rc.right = center.x + radius;
        rc.top = center.y + radius;
        rc.bottom = center.y - radius;
    }
	else
    {
    
        std::vector<sPoint> vArcVertex;
        vArcVertex.push_back(start);
        vArcVertex.push_back(end);    

        //!< 判断圆的四个顶点是不是在圆弧上,在圆弧上的顶点参与计算外接矩形
        sPoint ptCirList[] = {
     center + Point(0, radius), 
            center + Point(radius, 0),
            center + Point(-radius, 0),
            center + Point(0, -radius) };
        for (int i = 0; i < 4; i++)
        {
    
            if (isOn(center, start, end, cw, ptCirList[i], EPS))
            {
    
                vArcVertex.push_back(ptCirList[i]);
            }
        }

        rc.right = rc.top = MIN_NUM;
        rc.left = rc.bottom = MAX_NUM;
        for (auto& pt : vArcVertex)
        {
    
            rc.left = min(rc.left, pt.x);
            rc.right = max(rc.right, pt.x);
            rc.top = max(rc.top, pt.y);
            rc.bottom = min(rc.bottom, pt.y);
        }        
    }
    return rc;
}

圆弧相对距离的点

在这里插入图片描述

//!< 根据某点旋转
void rotate(Point& src, const Point& center, const float& sweepAng)
{
    
    float xOrg = src.x, yOrg = src.y;
    src.x = center.x + (xOrg - center.x) * cos(angle) - (yOrg - center.y) * sin(angle);
    src.y = center.y + (xOrg - center.x) * sin(angle) + (yOrg - center.y) * cos(angle);
}

//!< 圆弧上以起点位置,计算相对偏移distance的点
Point getSatrtOffsetOnArc(const Point& center, const Point& start, const Point& end, const bool& cw, const float& distance)
{
    
    //!< 计算圆弧半径
    double radius = getLength(center, start);
    //!< 圆弧长度对应圆心角
	float sweepAng =  distance / radius;
	Point curPoint = start;
	if (cw)
        sweepAng = -sweepAng;

	rotate(curPoint, center, sweepAng);
	return curPoint;
}

圆弧与线段相交

在这里插入图片描述

计算
  1. 判断圆心到线段的最短距离是不是小于半径,大于半径的时候肯定是不会与圆弧相交的
  2. 求出圆弧与直线的交点,最多两个,需要满足既在圆弧上,也在线段上
//!< 判断点p是否在线段(s, e)上
bool isOnLineSeg(const Point& s, const Point& e, const Point& p, const float& eps)
{
    
    float c = getLength(s, e);
    float a = getLength(s, p);
    float b = getLength(e, p);
    //!< 构成三角形,运用定理两边之和大于第三边,等于第三边则构成线段,点p在线段上
    if (abs(a + b - c) < eps)
        return true;
    else
        return false;
}

//!< 求出圆弧与线段相交的交点
vector<Point> getArcLineSegCross(const Point& center, const Point& start, const Point& end, const bool& cw, const Point& s, const Point& e, const float& eps)
{
    
    float x1 = s.x;
    float y1 = s.y;
    float dx = e.x - s.x;
    float dy = e.y - s.y;

    float cx = center.x;
    float cy = center.y;
    float r = getLength(center, start);

    //!< 圆弧与直线相交,求得两交点的公式
    float a = dx * dx + dy * dy;
    float b = 2 * (dx * (x1 - cx) + dy * (y1 - cy));
    float c = (x1 - cx) * (x1 - cx) + (y1 - cy) * (y1 - cy) - r * r;

    vector<Point> vCrossPoint;
    float discriminant = b * b - 4 * a * c;
    if (discriminant > eps)
    {
    
        float t1 = (-b + sqrt(discriminant)) / (2 * a);
        float t2 = (-b - sqrt(discriminant)) / (2 * a);
        
        Point intersection1 = {
     x1 + t1 * dx, y1 + t1 * dy };
        Point intersection2 = {
     x1 + t2 * dx, y1 + t2 * dy };
		
        Point intersectionArray[] = {
    intersection1, intersection2};
        
        int resultSize = 2;
        //!< 相切的情况, 只有一个解
        if (abs(t1 - t2) < eps)
        {
    
            resultSize = 1;
        }
        
        for (int i = 0; i < resultSize; i++)
        {
    
            if (isOn(center, start, end, cw, intersectionArray[i], eps) &&
               isOnLineSeg(s, e, intersectionArray[i], eps))
            {
    
             	vCrossPoint.push(intersection1);   
            }
        }        
    }
    return vCrossPoint;
}

线段外与圆相切的问题

需要做的效果

在这里插入图片描述

已知
  1. 已知线段起点终点
  2. 鼠标位置
  3. 需要构建一个相切与该线段的圆,圆弧终点为鼠标当前点,起点为线段端点(就认为是起点吧)
计算
  1. 鼠标位置与线段端点连线组成线段AB,提前可知圆上任意两点连线即(AB)的中垂线必过圆心,所以AB的中垂线必过圆心
  2. 因为原线段需要与所求的圆弧相切,即原线段端点的垂线也必过该圆心
  3. 以上所得两直线的交点即为圆心
//!< 计算线段的中垂线
void getMidPerpendicularLine(const Point& s1, const Point& e1, Point& s2, Point& e2, const float& eps)
{
    
    Point midPoint = (s1 + e1) / 2.0f;
    float len = getLength(s1, e1) / 2.0f;
    if (abs(s1.x - e1.x) < eps && abs(s1.y - e1.y) < eps)
    {
    
        //!< 同一个点, 不做任何处理
    }
    else if (abs(s1.x - e1.x) < eps)
    {
    
        s2.x = midPoint.x;
        s2.y = midPoint.y + len;

        e2.x = midPoint.x;
        e2.y = midPoint.y - len;
    }
    else if (abs(s1.y - e1.y) < eps)
    {
    
        s2.x = midPoint.x + len;
        s2.y = midPoint.y;

        e2.x = midPoint.x - len;
        e2.y = midPoint.y;
    }
    else
    {
    
        //!< 沿着中点随便旋转90°都可以组成中垂线
        s2 = s1;
		rotate(s2, midPoint, PI / 2);
        
        e2 = e1;
		rotate(e2, midPoint, PI / 2);
    }
}

//!< 两直线求交点
bool getLineCross(const Point& p1, const Point& p2, const Point& p3, const Point& p4, sPoint& p, const float& eps)
{
    
    //!< 构建直线L1
    int sign = 1;
    double a1 = p2.y - p1.y;
    if (a1 < eps)
    {
    
        sign = -1;
        a1 = sign * a1;
    }
    double b1 = sign * (p1.x - p2.x);
    double c1 = sign * (p1.y * p2.x - p1.x * p2.y);

    //!< 构建直线L2
    sign = 1;
    double a2 = p4.y - p3.y;
    if (a2 < eps)
    {
    
        sign = -1;
        a2 = sign * a2;
    }
    double b2 = sign * (p3.x - p4.x);
    double c2 = sign * (p3.y * p4.x - p3.x * p4.y);

    //!< 求L1和L2的交点
    double d = a1 * b2 - a2 * b1;
    if (abs(d) < eps) // 不相交 
        return false;
    
    p.x = (c2 * b1 - c1 * b2) / d;
    p.y = (a2 * c1 - a1 * c2) / d;
    return true;
}

//!< 计算相切的圆弧, 假设以线段起点为圆弧起点,鼠标位置为圆弧终点来计算圆弧
//!< 这里需要注意的是,圆弧的方向,需要提前自己确定
void calcTangentArc(const Point& s, const Point& e, const Point& mousePos, Point& center, Point& arcStart, Point& arcEnd, const float& eps)
{
    
    //!< 过线段起点的垂线s, p1
    Point p1;
    rotate(e, s, PI / 2);
    
    //!< 线段的中垂线pArc1, pArc2
    Point pArc1, pArc2;
    getMidPerpendicularLine(s, mousePos, pArc1, pArc2, EPS);
    
    Point pArcCenter;
    //!< 如果有交点,算出圆心
    if (getLineCross(s, p1, pArc1, pArc3, pArcCenter, EPS))
    {
    
        center = pArcCenter;
        arcStart = s;
        arcEnd = mousePos;
    }
}
实现效果

下面的效果中,我是已知轮廓的方向的,所以做出了镜像的圆弧

在这里插入图片描述

圆弧分割成多线段

一些时候画圆弧+线段连起来的时候,一些API并并不能完美的画出来,起点是对的,终点会有些偏差,可能缩小的时候看不出来差别,放大到了节点处会出现断开的情况。一些做法画圆弧,不用画圆弧的函数来做,把圆弧分成很多个线段,连起来。这样起点和终点可以保证正确。

//!< 圆弧分割成多线段集
void vector<Point> toPoints(const Point& center, const Point& start, const Point& end, const bool& cw, const int& ptCnts)
{
    
    std::vector<sPoint> vPts;
    // 起点,圆心,终点
    float radius = getLength(center, start);
    float startAngle = getAngle(center, start);
    float sweepAngle = 0.0f;
    calcArcAngle(center, start, end, cw, sweepAngle)

    sPoint ptCur = start;
    vPts.push_back(ptCur);
    for (int i = 1; i < ptCnts; i++)
    {
    
        ptCur.x = center.x + radius * cos(startAngle + (cw ? -1 : 1) * (sweepAngle * i / count));
        ptCur.y = center.y + radius * sin(startAngle + (cw ? -1 : 1) * (sweepAngle * i / count));
        vPts.push_back(ptCur);
    }
    ptCur = end;
    vPts.push_back(ptCur);

    return vPts;
}

解析实现效果

在这里插入图片描述

最后

感谢各位大佬的无私奉献。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yoyo18520/article/details/135351162

智能推荐

什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?_成员内部类和局部内部类的区别-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别

分布式系统_分布式系统运维工具-程序员宅基地

文章浏览阅读118次。分布式系统要求拆分分布式思想的实质搭配要求分布式系统要求按照某些特定的规则将项目进行拆分。如果将一个项目的所有模板功能都写到一起,当某个模块出现问题时将直接导致整个服务器出现问题。拆分按照业务拆分为不同的服务器,有效的降低系统架构的耦合性在业务拆分的基础上可按照代码层级进行拆分(view、controller、service、pojo)分布式思想的实质分布式思想的实质是为了系统的..._分布式系统运维工具

用Exce分析l数据极简入门_exce l趋势分析数据量-程序员宅基地

文章浏览阅读174次。1.数据源准备2.数据处理step1:数据表处理应用函数:①VLOOKUP函数; ② CONCATENATE函数终表:step2:数据透视表统计分析(1) 透视表汇总不同渠道用户数, 金额(2)透视表汇总不同日期购买用户数,金额(3)透视表汇总不同用户购买订单数,金额step3:讲第二步结果可视化, 比如, 柱形图(1)不同渠道用户数, 金额(2)不同日期..._exce l趋势分析数据量

宁盾堡垒机双因素认证方案_horizon宁盾双因素配置-程序员宅基地

文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置

谷歌浏览器安装(Win、Linux、离线安装)_chrome linux debian离线安装依赖-程序员宅基地

文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖

烤仔TVの尚书房 | 逃离北上广?不如押宝越南“北上广”-程序员宅基地

文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...

随便推点

java spark的使用和配置_使用java调用spark注册进去的程序-程序员宅基地

文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序

汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用_uds协议栈 源代码-程序员宅基地

文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码

AUTOSAR基础篇之OS(下)_autosar 定义了 5 种多核支持类型-程序员宅基地

文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型

VS报错无法打开自己写的头文件_vs2013打不开自己定义的头文件-程序员宅基地

文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件

【Redis】Redis基础命令集详解_redis命令-程序员宅基地

文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令

URP渲染管线简介-程序员宅基地

文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线

推荐文章

热门文章

相关标签