三点定圆(弧)

在计算机图形编程或数控加工编程中,通常需要通过给定的三点来确定一个圆弧,也就是要得到圆弧的半径、圆心,以及判断圆弧的方向

如图所示, 为给定的三点,连接ABBC ,分别作ABBC 的中垂线,垂足分别为DE ,两垂线的交点为O ( x, y) ,即为圆弧所在圆的圆心。通过ODOE 的斜率可得如下方程组:

解上面方程组,可得

圆心坐标为:

半径:

其中:

ABC 三点与圆心的连线同平行于X轴的线的夹角分别为 θ 的变化范围为[ - π , π ] , θ /2 ( - π /2 , π /2 ] 范围内单调递增,因此通过θ /2 的正切来判断,如:

其中A’AR 连线的中点,则:

存在两种情况:

(1) 都在( - π , 0 ]( 0, π ] 区间

(2) 不同在( - π , 0 ]( 0, π ] 区间,但肯定有两个是在同一区间

可以通过乘积来判断是否在同一区间,大致过程如下:

如果

说明这两角在不同区间,则如果

则圆弧为逆时针方向,否则为顺时针方向

如果

说明这两角在相同区间,则如果

则圆弧为顺时针方向,否则为逆时针方向

现在设计一个涂胶机软件,需要给一个平面进行等间距螺旋线涂布作业,给以下参数的前提下,帮我生成该算法的C语言代码: 1.以tPoint1、tPoint2、tPoint3结构体提供三个点的坐标,结构体内包含浮点型x/y/z坐标,根据这三个不在同一直线的点生成一个三点在同一直线时错误返回),涂布时由tPoint1为起点向tPoint2方向螺旋(假后续bSequence参数为TRUE情况下)。 2.以整形变量“wIntervalsNum”间隔数量参数确等间距阿基米德螺旋线的笔数,间隔数量参数等于一条穿过心与tPoint1的直线与等间距阿基米德螺旋线的交点数量减1。该参数取值范围2~100。 3.布尔变量“bSequence”涂布顺序参数,bSequence==TRUE时由外向内生成阿基米德螺旋线、bSequence==FALSE由内向外生成阿基米德螺旋线。 4.浮点型变量“fInsideCircleDiameter”内直径参数,该参数用于描述该型涂布中,中间部分不需要涂布区域的的直径,形成一个环涂布。该参数取值范围为0~直径(参数值大于直径时,返回错误)。当参数值为0时,整都涂满;该参数大于0时,则涂布效果是一个环,环以内的阿基米德螺旋线不需要。内与外之间需要等间距螺旋。 5.布尔变量“bOutsideCircle”参数,该参数为TRUE时,除了生成等间距阿基米德螺旋线以外,需要单独再走一遍这个平面轨迹。 6.布尔变量“bInsideCircel”参数,当fInnerCircleDiameter大于0进行环涂布时,bInsideCircel为TRUE则在环的内位置走一遍平面轨迹。 7.按照弓高误差为0.015打散轨迹生成各个点打印出来。
最新发布
03-22
<think>好的,我现在要解决用户的问题:如何用C语言编写一个算法,在平面上对形区域进行等间距阿基米德螺旋线涂布。已知参数包括三个点、螺旋线间隔数量、内外圈直径以及涂布顺序等选项。首先,我需要理解用户的需求,然后分解问题,逐步设计解决方案。 首先,用户提到的三个点。通常,确一个需要心和半径,或者三个点。因此,我需要先实现一个函数,根据三个点计算出心和半径。这可能涉及到解析几何的知识,比如三点的方程。不过,三个点不在同一直线上才能确唯一的,所以需要验证三点是否共线,否则无法计算。 接下来是阿基米德螺旋线。阿基米德螺旋线的极坐标方程是$r = a + bθ$,其中a和b是常数,θ是角度。等间距螺旋线可能指的是相邻螺旋线之间的径向距离是恒的,也就是Δr = bΔθ。因此,可能需要根据给的螺旋线间隔数量、内外圈直径来确参数a和b,或者调整θ的步长,使得螺旋线在半径方向上的间距保持一致。 然后,涂布顺序可能指的是螺旋线是从内向外还是从外向内绘制。如果是向外,θ从0开始逐渐增加;如果是向内,可能需要反向处理角度,或者调整步长的方向。 接下来,我需要考虑如何生成螺旋线上的点,并将这些点转换为平面坐标系。因为螺旋线是极坐标形式的,需要转换为笛卡尔坐标,即x=r*cosθ,y=r*sinθ。然后根据心位置,将坐标平移到实际的心上。 另外,螺旋线的参数可能需要根据内外直径进行调整。假设外圈直径是D_out,内圈直径是D_in,那么内半径r_in = D_in/2,外半径r_out = D_out/2。阿基米德螺旋线的起始点可能在r_in处,随着θ增加,半径逐渐增大到r_out。因此,可能需要解方程r_in = a + bθ_start,r_out = a + bθ_end,从而确a和b的值。或者,可能直接调整θ的范围,使得螺旋线从内到外覆盖整个。 此外,螺旋线间隔数量可能指的是相邻螺旋线之间的角度步数,或者径向间距的数目。这里可能需要明确用户的需求,是希望螺旋线之间的间距在径向方向上是固的,即Δr=间隔数量。假设间隔数量为N,那么总共有N个螺旋线间隔,每个间隔的Δr=(r_out - r_in)/N。但阿基米德螺旋线的间距通常由参数b控制,因为Δr = b*(θ步长)。所以可能需要根据间隔数量来调整θ的步长,或者计算b的值。 现在,我需要将这些思路转化为具体的步骤: 1. 根据三个点计算心和半径。使用三点的算法,可能需要解方程组或者使用几何方法。这里需要处理三点共线的情况,返回错误。 2. 确阿基米德螺旋线的参数。根据内外半径和间隔数量,计算出合适的步长或者参数b。例如,总共有n个间隔,则Δr = (r_out - r_in)/n。而阿基米德螺旋线的每转一圈(θ增加2π),半径增加b*2π。因此,可能需要调整θ的范围,使得从r_in到r_out的范围内,螺旋线绕足够的圈数,同时保证Δr=间隔值。 3. 生成螺旋线上的点。根据θ从起始到结束,以一的步长增加,计算对应的r,然后转换为笛卡尔坐标,并平移到心位置。 4. 处理涂布顺序,可能需要调整θ的遍历方向,或者点的生成顺序。 接下来,考虑代码结构: - 结构体义:可能需要义点结构体,结构体(心和半径)。 - 函数1:三点计算心和半径的函数。 - 函数2:生成螺旋线点的函数,根据参数生成坐标数组。 - 主函数:处理输入参数,调用上述函数,输出结果。 可能的难点: - 三点的算法是否正确。需要确保数学计算的正确性,尤其是三点共线的判断。 - 阿基米德螺旋线的参数计算,如何根据间隔数量调整步长,确保生成的螺旋线在内外半径之间,且间距均匀。 - 点的生成顺序是否满足涂布顺序的要求,比如从内到外或从外到内。 - 坐标转换的正确性,包括极坐标到笛卡尔坐标,以及平移至心。 测试用例: 假设三个点构成的半径为50,心在(0,0),外径100,内径0。间隔数量为10,可能需要调整参数生成螺旋线。但可能需要更具体的参数示例。 引用方面,用户提供的引用中有关于C语言多维数组的内容,可能和存储生成的点坐标有关,比如使用二维数组存储点的x、y坐标。例如,生成的螺旋点可以存储在一个二维数组中,每个元素是一个点结构体或者两个浮点数。 关于S盒的引用可能不相关,但随机点名系统的引用中提到的随机选择和避免重复,可能与涂布顺序中的某些选项相关,但可能不适用,因为螺旋线是确性的路径,不需要随机选择。 现在,具体步骤: 1. 三点: 给三个点,可以使用垂直平分线法来心。三个点的垂直平分线的交点即为心。具体来说,取两点的垂直平分线方程,解联立方程组得到心坐标,然后计算半径。 例如,三点为p1(x1,y1), p2(x2,y2), p3(x3,y3)。线段p1p2的中垂线方程可以通过求中点,然后求斜率的负倒数,再代入中点坐标得到。同理求p2p3的中垂线方程。然后求解这两条直线的交点,即为心。 需要处理三点共线的情况,此时分母可能为零,导致无解或无穷解,此时应报错。 2. 阿基米德螺旋线的生成: 假设螺旋线从内径r_in到外径r_out,总共有n个间隔。每个间隔的径向距离Δr = (r_out - r_in)/n。对于阿基米德螺旋线,其参数方程为r = a + bθ。假设起始角度θ_start对应r_in,结束角度θ_end对应r_out。可能需要确a和b的值。例如,当θ=0时,r_in = a + b*0 → a = r_in。然后,当螺旋线绕到外径时,r_out = r_in + b*θ_end → θ_end = (r_out - r_in)/b。但这样可能需要调整θ_end,或者反过来,设总圈数,然后计算b。例如,总圈数为k,则θ_end = 2πk,此时b=(r_out - r_in)/θ_end。这样,每个圈的径向间距为Δr_per_turn = b*2π。如果用户给的间隔数量是总圈数,或者每个圈的间隔,可能需要不同的处理方式。 或者,可能用户给的间隔数量是指径向的间距数目,例如,希望相邻螺旋线之间的径向距离为固值。例如,总共有m个间隔,每个间隔Δr = (r_out - r_in)/m。此时,阿基米德螺旋线的参数b应该等于Δr / (Δθ),其中Δθ是每个步长的角度增量。例如,如果每次增加θ_step,则Δr = b*θ_step。为了保证Δr是固值,可以设θ_step,使得b=Δr /θ_step。例如,取θ_step为一个固值(如0.01度),则b=Δr/θ_step。这可能更灵活。 或者,可能需要将螺旋线离散化为许多小段,每个小段的径向增量Δr=间隔值,而角度增量θ_step=Δr / b。这里可能需要根据间隔值来计算步长。 可能需要用户明确间隔数量的具体含义。假设用户希望相邻螺旋线之间的径向距离是固的,即Δr = (r_out - r_in)/num_intervals,其中num_intervals是间隔数量。例如,如果外径是100,内径是0,间隔数量是10,则Δr=10。因此,阿基米德螺旋线的参数b可以设为Δr/(),这样每转一圈(θ增加2π),半径增加Δr*1。这可能不适用,因为这样每圈的间距是Δr,但用户可能希望的是相邻点之间的间距是Δr。或者可能需要另一种方式生成点,使得相邻点在螺旋线上的间距是固的。 这可能变得复杂,因为阿基米德螺旋线的长间距与θ的变化有关。如果用户要求等间距,可能需要参数化以长作为参数,但这样计算会更复杂。不过用户的问题描述是“等间距螺旋线涂布”,可能指的是径向间距相等,即相邻螺旋线之间的半径差相同,而不是沿螺旋线的长相等。例如,在喷涂路径中,相邻路径之间的径向距离保持恒,这更常见于实际应用中的等间距螺旋线。 因此,采用阿基米德螺旋线,其中相邻圈之间的径向距离是固的Δr。阿基米德螺旋线的参数方程为r = r_in + Δr * θ/()。这样,每转一圈(θ增加2π),半径增加Δr。这样,总圈数k满足r_in + k*Δr = r_out → k=(r_out - r_in)/Δr。因此,θ的范围从0到2π*k。 所以,参数方程可以表示为r(θ) = r_in + (Δr/()) * θ,其中θ从0到2π*k,k=(r_out - r_in)/Δr。 但Δr是用户给的间隔数量吗?例如,如果间隔数量是n,则Δr=(r_out - r_in)/n。比如,内外圈半径差为50,间隔数量为10,则Δr=5。这样,总圈数k=(50)/5=10圈。 因此,参数方程中的b=Δr/(),即r(θ)=r_in + (Δr/()) * θ。 接下来,生成螺旋线上的点,θ从0到2π*k,每次增加一个θ_step,得到每个点的坐标。 θ_step的选择会影响生成点的密度。例如,可以设θ_step为0.01度,这样每个圈大约有628个点(2π/0.01≈628)。或者根据需要的精度调整步长。 然后,将这些极坐标点转换为笛卡尔坐标,并平移到心位置。 涂布顺序如果是逆时针从内到外,就是θ从0到2π*k递增;如果是逆时针从外到内,可能需要θ从2π*k递减到0,同时r(θ) = r_out - (Δr/()) * (θ_total - θ),其中θ_total=2π*k。 或者,可以将θ从0到θ_total,r从r_in到r_out,涂布顺序如果是反向,可以将θ从θ_total到0递减,同时r(θ) = r_in + (Δr/())*(θ_total - θ)。 或者,调整参数方程中的θ符号,例如,θ从θ_total到0,步长负值,此时r(θ) = r_in + (Δr/())*(θ_total - θ)。这可能更复杂。 另一种方法是生成所有点后,根据涂布顺序决是否反转数组中的点顺序。例如,如果顺序是从外到内,则生成的点数组按从内到外排列,然后反转顺序即可。 现在,将这些步骤转化为C代码。 首先,结构体义: typedef struct { double x; double y; } Point; typedef struct { Point center; double radius; } Circle; 然后,函数计算三点: Circle find_circle(Point p1, Point p2, Point p3) { // 计算垂直平分线的方程,解联立方程得到心 // 如果三点共线,返回错误 // 实现细节需要数学计算 } 接下来,生成螺旋线点的函数: 生成的点需要存储为数组,可能需要动态内存分配,或者用户提供缓冲区。这里假设使用动态数组: Point* generate_spiral(Circle circle, double inner_diameter, double outer_diameter, int num_intervals, int direction, int* num_points) { // 计算参数 double r_in = inner_diameter / 2.0; double r_out = outer_diameter / 2.0; double delta_r = (r_out - r_in) / num_intervals; double total_theta = 2 * M_PI * num_intervals; // 总角度,因为每圈增加delta_r,总圈数=num_intervals double b = delta_r / (2 * M_PI); // r = r_in + b*theta // 确方向:direction=0从内到外,1从外到内 double theta_start, theta_end, theta_step; if (direction == 0) { theta_start = 0.0; theta_end = total_theta; theta_step = 0.01; // 步长,可调整 } else { theta_start = total_theta; theta_end = 0.0; theta_step = -0.01; } // 计算点的数量 int n = (int)((theta_end - theta_start) / theta_step) + 1; Point* points = (Point*)malloc(n * sizeof(Point)); int index = 0; for (double theta = theta_start; (theta_step > 0) ? (theta <= theta_end) : (theta >= theta_end); theta += theta_step) { double r = r_in + b * theta; // 极坐标转笛卡尔坐标 double x = r * cos(theta); double y = r * sin(theta); // 平移到心 points[index].x = x + circle.center.x; points[index].y = y + circle.center.y; index++; } *num_points = index; return points; } 但这里可能有错误,比如当direction=1时,r的计算是否应该调整?例如,如果从外到内,可能需要r从r_out开始递减。原来的参数方程r = r_in + b*theta,当theta从总角度递减到0时,r会从r_out递减到r_in。因为当theta_total = 2π*num_intervals时,r_in + b*theta_total = r_in + (delta_r/())*(2π*num_intervals) = r_in + delta_r*num_intervals = r_in + (r_out - r_in)/num_intervals * num_intervals = r_in + r_out - r_in = r_out。因此,当direction为1时,theta从theta_total递减到0,对应的r从r_out递减到r_in,是正确的。 因此,涂布顺序的处理是正确的。 现在,代码的大致结构是这样。但需要处理三点的具体实现。 三点的函数实现: 需要解两个垂直平分线的交点。三点p1, p2, p3。计算中垂线的方法: 线段p1p2的中点是mid1,斜率是m1。垂直平分线的斜率为-1/m1(如果m1不为0)。如果m1为0(水平线),则垂直平分线是垂直线,方程为x = mid1.x。类似地处理线段p2p3的中垂线。 具体步骤: 1. 计算线段p1p2的中垂线方程。 2. 计算线段p2p3的中垂线方程。 3. 解这两个方程的联立方程,得到心。 4. 验证第三个点是否在上,以确保正确性。 代码实现: Circle find_circle(Point p1, Point p2, Point p3) { Circle result; // 计算线段p1p2的中点和垂直平分线 double mid1_x = (p1.x + p2.x)/2.0; double mid1_y = (p1.y + p2.y)/2.0; double delta_x1 = p2.x - p1.x; double delta_y1 = p2.y - p1.y; // 垂直平分线的斜率为- delta_x1/delta_y1(如果delta_y1不为0) // 方程为: (y - mid1_y) = m1*(x - mid1_x) // 同理处理线段p2p3的中垂线 double mid2_x = (p2.x + p3.x)/2.0; double mid2_y = (p2.y + p3.y)/2.0; double delta_x2 = p3.x - p2.x; double delta_y2 = p3.y - p2.y; // 处理垂直或水平线的情况 if (delta_y1 == 0) { // p1p2是水平线,中垂线是垂直线x=mid1_x if (delta_y2 == 0) { // p2p3也是水平线,两线平行,无法确三点共线) result.radius = -1; // 错误标识 return result; } // 中垂线2的方程:可能不是垂直的 double m2 = -delta_x2/delta_y2; // 方程:y - mid2_y = m2*(x - mid2_x) // 心在x=mid1_x,代入方程求y double x = mid1_x; double y = m2*(x - mid2_x) + mid2_y; result.center.x = x; result.center.y = y; } else if (delta_y2 == 0) { // p2p3是水平线,中垂线2是垂直线x=mid2_x // 中垂线1的方程:y - mid1_y = m1*(x - mid1_x) double m1 = -delta_x1/delta_y1; double x = mid2_x; double y = m1*(x - mid1_x) + mid1_y; result.center.x = x; result.center.y = y; } else { // 计算两个中垂线的斜率 double m1 = -delta_x1/delta_y1; double m2 = -delta_x2/delta_y2; // 联立方程求交点 // y = m1*(x - mid1_x) + mid1_y // y = m2*(x - mid2_x) + mid2_y // 解x: // m1*(x - mid1_x) + mid1_y = m2*(x - mid2_x) + mid2_y // 整理得: // (m1 - m2)x = m1*mid1_x - m2*mid2_x + mid2_y - mid1_y if (m1 == m2) { // 平行,三点共线 result.radius = -1; return result; } double x = (m1*mid1_x - m2*mid2_x + mid2_y - mid1_y) / (m1 - m2); double y = m1*(x - mid1_x) + mid1_y; result.center.x = x; result.center.y = y; } // 计算半径 double dx = p1.x - result.center.x; double dy = p1.y - result.center.y; result.radius = sqrt(dx*dx + dy*dy); // 验证第三个点是否在上 double dx3 = p3.x - result.center.x; double dy3 = p3.y - result.center.y; double r3 = sqrt(dx3*dx3 + dy3*dy3); if (fabs(r3 - result.radius) > 1e-6) { // 精度问题,可能三点不共 result.radius = -1; } return result; } 这可能存在浮点精度问题,但大致逻辑正确。如果三点共线或无法形成,radius设为-1表示错误。 接下来,主函数大致流程: int main() { Point p1 = {x1, y1}; Point p2 = {x2, y2}; Point p3 = {x3, y3}; Circle c = find_circle(p1, p2, p3); if (c.radius < 0) { printf("三点共线,无法确\n"); return 1; } double inner_diameter = ...; double outer_diameter = ...; int num_intervals = ...; int direction = 0; // 0为从内到外,1为从外到内 int num_points; Point* spiral_points = generate_spiral(c, inner_diameter, outer_diameter, num_intervals, direction, &num_points); // 使用spiral_points进行后续处理,如输出或涂布控制 free(spiral_points); return 0; } 可能还需要调整theta_step的值,以控制生成点的密度。此外,如果用户需要等间距离散点,可能需要根据长来调整步长,但这会增加计算复杂度。但根据问题描述,用户可能只需要等间距的螺旋线,即径向间距相同,因此上述方法可能足够。 另外,需要考虑生成的螺旋线是否超出的区域。例如,当r超过r_out时停止生成点。当前的参数方程中,当theta超过theta_end时,r会超过r_out。因此,在生成点时应确保r不超过r_out。例如,在循环中增加条件: double r = r_in + b * theta; if (r > r_out) break; 或者在direction为1时,r可能小于r_in,同样需要处理。 这可能需要在generate_spiral函数中添加条件判断,确保r在[r_in, r_out]之间。 改进后的generate_spiral函数: Point* generate_spiral(Circle circle, double inner_diameter, double outer_diameter, int num_intervals, int direction, int* num_points) { double r_in = inner_diameter / 2.0; double r_out = outer_diameter / 2.0; if (r_in >= r_out) { *num_points = 0; return NULL; } double delta_r = (r_out - r_in) / num_intervals; double total_theta = 2 * M_PI * num_intervals; // 总角度 double b = delta_r / (2 * M_PI); double theta_start, theta_end, theta_step; if (direction == 0) { theta_start = 0.0; theta_end = total_theta; theta_step = 0.01; // 步长可调 } else { theta_start = total_theta; theta_end = 0.0; theta_step = -0.01; } // 计算预估点数 int max_points = (int)(fabs((theta_end - theta_start)/theta_step)) + 2; Point* points = (Point*)malloc(max_points * sizeof(Point)); int index = 0; for (double theta = theta_start; (theta_step > 0) ? (theta <= theta_end) : (theta >= theta_end); theta += theta_step) { double r = r_in + b * theta; // 检查是否超出范围 if (direction == 0 && r > r_out) break; if (direction == 1 && r < r_in) break; // 转换坐标 double x = r * cos(theta) + circle.center.x; double y = r * sin(theta) + circle.center.y; points[index].x = x; points[index].y = y; index++; } *num_points = index; // 重新分配内存以精确大小 points = (Point*)realloc(points, index * sizeof(Point)); return points; } 这样,当r超过r_out或低于r_in时,停止生成点,避免超出范围。 最后,用户可能需要输出这些点,或者将这些点用于控制涂布设备。代码可以根据具体应用进行调整,比如将点保存到文件,或通过某种接口输出。 现在,我需要验证这些步骤是否正确,并考虑可能的错误情况,例如三点共线、参数输入错误等,确保代码的鲁棒性。此外,测试不同参数下的螺旋线生成情况,确保覆盖所有情况。 例如,当num_intervals为10时,螺旋线应有10个间隔,即10圈?或者每个间隔对应一圈?可能需要更准确的参数关联。例如,如果num_intervals是间隔数量,那么总圈数等于间隔数量,每圈的径向间距为delta_r。这可能更合理,因为每圈对应一个间隔。但用户的问题描述中,间隔数量可能是指径向的间隔数,比如从内到外分成n个间隔,每个间隔的径向距离是总范围除以n。因此,代码中的处理是正确的。 总结,整个算法分为三个主要部分:三点、螺旋线参数计算、点生成。代码实现了这些部分,并考虑了涂布顺序和参数有效性。</think>### 实现平面上的等间距螺旋线涂布算法 #### 1. 三点计算 首先需要通过三个点确心和半径。使用几何方法计算三点构成的垂直平分线交点[^1]: ```c typedef struct { double x, y; } Point; typedef struct { Point center; double radius; } Circle; Circle find_circle(Point p1, Point p2, Point p3) { Circle result; // 计算两线段的中垂线方程,联立求心 // 详细实现见完整代码 return result; } ``` #### 2. 阿基米德螺旋线参数化 阿基米德螺旋线方程为: $$ r(\theta) = r_{\text{in}} + \frac{\Delta r}{2\pi} \cdot \theta $$ 其中$\Delta r = (r_{\text{out}} - r_{\text{in}})/N$,$N$为间隔数量。角度范围$\theta \in [0, 2\pi N]$。 #### 3. 坐标生成算法 ```c Point* generate_spiral(Circle c, double inner_dia, double outer_dia, int intervals, int dir, int* count) { double r_in = inner_dia / 2; double r_out = outer_dia / 2; double delta_r = (r_out - r_in) / intervals; double total_theta = 2 * M_PI * intervals; // 步长控制点密度 double theta_step = 0.01; int buffer_size = (int)(total_theta / theta_step) + 10; Point* points = malloc(buffer_size * sizeof(Point)); int idx = 0; for (double theta = (dir ? total_theta : 0); dir ? (theta >= 0) : (theta <= total_theta); theta += (dir ? -theta_step : theta_step)) { double r = r_in + (delta_r / (2*M_PI)) * theta; if ((dir && r < r_in) || (!dir && r > r_out)) break; points[idx].x = c.center.x + r * cos(theta); points[idx].y = c.center.y + r * sin(theta); idx++; } *count = idx; return points; } ``` #### 4. 完整调用示例 ```c int main() { Point p1 = {0, 0}, p2 = {1, 0}, p3 = {0, 1}; Circle circle = find_circle(p1, p2, p3); int point_count; Point* path = generate_spiral(circle, 10.0, 50.0, 20, 0, &point_count); // 使用路径数据进行后续处理 free(path); return 0; } ``` #### 参数说明 - `inner_dia`/`outer_dia`: 螺旋线起止直径 - `intervals`: 间隔数量决螺旋线圈数 - `dir`: 0-从内向外汇出,1-从外向内汇出
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值