| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1344 人关注过本帖
标题:两个不同形状的椭圆求交点有人会吗
取消只看楼主 加入收藏
我善治鬼
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:107
专家分:181
注 册:2015-2-16
结帖率:100%
收藏
 问题点数:0 回复次数:1 
两个不同形状的椭圆求交点有人会吗
长短轴比例不同的, 使用C语言实现
搜索更多相关主题的帖子: 不同 C语言 椭圆 
2021-06-13 16:09
我善治鬼
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:107
专家分:181
注 册:2015-2-16
收藏
得分:0 
2D自转椭圆与曲线

程序代码:
#define 圆周率                            (3.14159265359)                    /* 圆周長除以圆直径 */
#define 壹周弧                            (6.28318530718)                    /* 两倍圆周率, 方便计算 */
#define 最大公差                        (0.0000001)                            /* 8位小数, 不宜修改 */
#define 最大周期                        (1.0)                                        /* 范围0~1.0 */


typedef    结构    结构椭圆{
    捌浮                横;
    捌浮                纵;
    捌浮                半径;
    捌浮                半高;
    捌浮                旋弧;
}    结构椭圆, * 手柄椭圆;


肆狀 视程显露 世界变换坐标(手柄坐标 坐标, 捌浮 基横, 捌浮 基纵, 捌浮 弧度, 枚举镜像 镜像) {
    若(!坐标 || (!弧度 && (镜像 == 镜像_無 || 镜像 > 镜像_双重))) 返回 假;
    若(镜像 == 镜像_水平) (坐标->横 = 基横 - 坐标->横 + 基横);
    其它 若(镜像 == 镜像_垂直) (坐标->纵 = 基纵 - 坐标->纵 + 基纵);
    其它 若(镜像 == 镜像_双重) (坐标->横 = 基横 - 坐标->横 + 基横, 坐标->纵 = 基纵 - 坐标->纵 + 基纵);
    若(!弧度) 返回 真;
    捌浮 半径 = 得到边長(坐标->横 - 基横, 坐标->纵 - 基纵);
    弧度 += 得到世界弧度(坐标->横 - 基横, 坐标->纵 - 基纵);
    坐标->横 = 基横 + 三角余弦(弧度) * 半径, 坐标->纵 = 基纵 + 三角正弦(弧度) * 半径;
    返回 真;
}


肆狀 视程显露 世界变换直线(手柄直线 直线, 捌浮 基横, 捌浮 基纵, 捌浮 弧度, 枚举镜像 镜像) {
    返回 直线&& 世界变换坐标((手柄坐标)直线, 基横, 基纵, 弧度, 镜像) &&
        世界变换坐标((手柄坐标)(&直线->横2), 基横, 基纵, 弧度, 镜像);
}


肆狀 视程显露 世界变换椭圆(手柄椭圆 椭圆, 捌浮 基横, 捌浮 基纵, 捌浮 弧度, 枚举镜像 镜像) {
    返回 椭圆&& 世界变换坐标((手柄坐标)椭圆, 基横, 基纵, 弧度, 镜像);
}


肆狀 视程显露 世界变换矩形(手柄矩形 矩形, 捌浮 基横, 捌浮 基纵, 捌浮 弧度, 枚举镜像 镜像) {
    若(!矩形) 返回 假;
    结构直线 直1 = 制作直线(矩形->左, 矩形->顶, 矩形->右, 矩形->底),
        直2 = 制作直线(矩形->右, 矩形->顶, 矩形->左, 矩形->底);
    若(!世界变换直线(&直1, 基横, 基纵, 弧度, 镜像) || !世界变换直线(&直2, 基横, 基纵, 弧度, 镜像)) 返回 假;
    捌浮 小1 = 得到最小(直1.横1, 直1.横2), 小2 = 得到最小(直2.横1, 直2.横2);
    捌浮 大1 = 得到最大(直1.横1, 直1.横2), 大2 = 得到最大(直2.横1, 直2.横2);
    矩形->左 = 得到最小(小1, 小2), 矩形->右 = 得到最大(大1, 大2);
    小1 = 得到最小(直1.纵1, 直1.纵2), 小2 = 得到最小(直2.纵1, 直2.纵2);
    大1 = 得到最大(直1.纵1, 直1.纵2), 大2 = 得到最大(直2.纵1, 直2.纵2);
    矩形->顶 = 得到最小(小1, 小2), 矩形->底 = 得到最大(大1, 大2);
    返回 真;
}


肆狀 视程显露 世界变换角形(手柄角形 角形, 捌浮 基横, 捌浮 基纵, 捌浮 弧度, 枚举镜像 镜像) {
    返回 角形&& 世界变换坐标((手柄坐标)角形, 基横, 基纵, 弧度, 镜像) &&
        世界变换坐标((手柄坐标)(&角形->横2), 基横, 基纵, 弧度, 镜像) &&
        世界变换坐标((手柄坐标)(&角形->横3), 基横, 基纵, 弧度, 镜像);
}


肆狀 视程显露 世界变换曲线(手柄曲线 曲线, 捌浮 基横, 捌浮 基纵, 捌浮 弧度, 枚举镜像 镜像) {
    返回 曲线&& 世界变换角形((手柄角形)曲线, 基横, 基纵, 弧度, 镜像);
}


肆狀 视程显露 延長直线(手柄直线 直线, 捌浮 長度) {
    若(!直线 || !長度) 返回 假;
    捌浮 弧度 = 得到世界弧度(直线->横1 - 直线->横2, 直线->纵1 - 直线->纵2);
    捌浮 宽 = 三角余弦(弧度) * 長度 / 2.0, 高 = 三角正弦(弧度) * 長度 / 2.0;
    直线->横1 += 宽, 直线->纵1 += 高, 直线->横2 -= 宽, 直线->纵2 -= 高;
    返回 真;
}


// 在此处制作椭圆, 可防止高度大于半径出现异常
结构椭圆 视程显露 制作椭圆(捌浮 横, 捌浮 纵, 捌浮 半径, 捌浮 半高, 捌浮 旋弧) {
    结构椭圆 椭圆 = { 横, 纵, 半径, (半高 && 半高 < 半径) ? 半高 : 半径, 旋弧 };
    返回 椭圆;
}


// 此椭圆是一个自转和倾斜的圆形, 使用圆形的面积和周長
捌浮 视程显露 得到椭圆面积(捌浮 半径) {
    返回 半径* 半径* 圆周率;
}


捌浮 视程显露 得到椭圆弧長(捌浮 半径, 捌浮 弧度) {
    返回 半径* 弧度;
}


捌浮 视程显露 得到椭圆半径(捌浮 周長) {
    返回 周長 / 壹周弧;
}


肆狀 视程显露 得到椭圆坐标(手柄椭圆 椭圆, 捌浮 周期, 手柄坐标 输出) {
    若(!椭圆 || !输出) 返回 假;
    输出->横 = 椭圆->横 + 三角余弦(周期 * 壹周弧) * 椭圆->半径;
    输出->纵 = 椭圆->纵 + 三角正弦(周期 * 壹周弧) * 椭圆->半高;
    若(椭圆->旋弧) 世界变换坐标(输出, 椭圆->横, 椭圆->纵, 椭圆->旋弧, 0);
    返回 真;
}


肆狀 视程显露 是坐标在椭线(捌浮 横, 捌浮 纵, 手柄椭圆 椭圆, 手柄坐标 交点) {
    若(!椭圆 || !椭圆->半径 || !椭圆->半高) 返回 假;
    捌浮 宽 = 横 - 椭圆->横, 高 = 纵 - 椭圆->纵, 边長 = 得到边長(宽, 高), 弧度;
    若(边長 > 椭圆->半径)  返回 假;
    若(椭圆->旋弧 && 椭圆->半径 != 椭圆->半高)        // 若椭圆自转反向旋转坐标
        (弧度 = 得到世界弧度(宽, 高) - 椭圆->旋弧, 宽 = 三角余弦(弧度) * 边長, 高 = 三角正弦(弧度) * 边長);
    若(绝对捌浮((宽 * 宽) / (椭圆->半径 * 椭圆->半径) + (高 * 高) / (椭圆->半高 * 椭圆->半高) - 1.0) > 最大公差) 返回 假;
    返回 交点 ? (交点->横 = 横, 交点->纵 = 纵, 真) : 真;
}


肆狀 视程显露 是坐标在椭面(捌浮 横, 捌浮 纵, 手柄椭圆 椭圆, 手柄坐标 交点) {
    若(!椭圆 || !椭圆->半径 || !椭圆->半高) 返回 假;
    捌浮 宽 = 横 - 椭圆->横, 高 = 纵 - 椭圆->纵, 边長 = 得到边長(宽, 高), 弧度;
    若(边長 > 椭圆->半径)  返回 假;
    若(椭圆->旋弧 && 椭圆->半径 != 椭圆->半高)        // 若椭圆自转反向旋转坐标
        (弧度 = 得到世界弧度(宽, 高) - 椭圆->旋弧, 宽 = 三角余弦(弧度) * 边長, 高 = 三角正弦(弧度) * 边長);
    若((宽 * 宽) / (椭圆->半径 * 椭圆->半径) + (高 * 高) / (椭圆->半高 * 椭圆->半高) > 1.0) 返回 假;
    返回 交点 ? (交点->横 = 横, 交点->纵 = 纵, 真) : 真;
}


肆狀 视程显露 是直线在椭线(结构直线 直线, 手柄椭圆 椭圆, 手柄坐标 交点) {
    捌浮 垂足, 横, 纵;
    若(!椭圆 || !椭圆->半径 || !椭圆->半高 || !得到垂足弧度(直线, &垂足)) 返回 假;
    若(是坐标在椭线(直线.横1, 直线.纵1, 椭圆, 交点) || 是坐标在椭线(直线.横2, 直线.纵2, 椭圆, 交点)) 返回 真;
    若(椭圆->半径 == 椭圆->半高)        // 若椭圆為圆形直接返回快速计算
        返回(横 = (椭圆->横 + 三角余弦(垂足) * 椭圆->半径), 纵 = (椭圆->纵 + 三角正弦(垂足) * 椭圆->半径),
            是相交直线(直线, 制作直线(横, 纵, 椭圆->横 + 椭圆->横 - 横, 椭圆->纵 + 椭圆->纵 - 纵), 交点));
    结构直线 原始 = 直线;
    若(椭圆->旋弧) 世界变换直线(&直线, 椭圆->横, 椭圆->纵, -椭圆->旋弧, 0);        // 先旋转直线
    捌浮 比例 = 椭圆->半径 / 椭圆->半高, 放纵 = 椭圆->纵 * 比例;        // 再投影直线和椭圆坐标
    直线.纵1 *= 比例, 直线.纵2 *= 比例;
    捌浮 長度 = 得到边長(直线.横2 - 直线.横1, 直线.纵2 - 直线.纵1);        // 计算直线与圆弧交点
    捌浮 周横 = (直线.横2 - 直线.横1) / 長度, 周纵 = (直线.纵2 - 直线.纵1) / 長度;
    捌浮 周期 = 周横 * (椭圆->横 - 直线.横1) + 周纵 * (放纵 - 直线.纵1);
    捌浮 切横 = 周期 * 周横 + 直线.横1, 切纵 = 周期 * 周纵 + 直线.纵1;
    捌浮 半径 = 得到边長(切横 - 椭圆->横, 切纵 - 放纵), 周距 = 得到平方根(椭圆->半径 * 椭圆->半径 - 半径 * 半径);
    若(半径 > 椭圆->半径) 返回 假;        // 無交点
    结构坐标 坐1, 坐2;        // 得到两个可能潜在的交点
    若(半径 < 椭圆->半径) (坐1.横 = (周期 - 周距) * 周横 + 直线.横1, 坐1.纵 = ((周期 - 周距) * 周纵 + 直线.纵1) / 比例,
        坐2.横 = (周期 + 周距) * 周横 + 直线.横1, 坐2.纵 = ((周期 + 周距) * 周纵 + 直线.纵1) / 比例);
    其它(坐1.横 = 坐2.横 = 切横, 坐1.纵 = 坐2.纵 = 切纵 / 比例);        // 复原交点的投影比例和自转弧度
    若(椭圆->旋弧) (世界变换坐标(&坐1, 椭圆->横, 椭圆->纵, 椭圆->旋弧, 0),
        世界变换坐标(&坐2, 椭圆->横, 椭圆->纵, 椭圆->旋弧, 0));        //    判断交点是否在原始直线
    返回 是坐标在直线(坐1.横, 坐1.纵, 原始, 交点) || 是坐标在直线(坐2.横, 坐2.纵, 原始, 交点);
}


肆狀 视程显露 是直线在椭面(结构直线 直线, 手柄椭圆 椭圆, 手柄坐标 交点) {
    若(!椭圆 || !椭圆->半径 || !椭圆->半高) 返回 假;
    返回 是坐标在椭面(直线.横1, 直线.纵1, 椭圆, 交点) || 是坐标在椭面(直线.横2, 直线.纵2, 椭圆, 交点) || 是直线在椭线(直线, 椭圆, 交点);
}


肆狀 视程显露 得到椭圆盒子(手柄椭圆 椭圆, 手柄矩形 输出) {
    若(!椭圆 || !输出) 返回 假;
    捌浮 ux = 椭圆->半径 * 三角余弦(椭圆->旋弧), uy = 椭圆->半径 * 三角正弦(椭圆->旋弧);
    捌浮 vx = 椭圆->半高 * 三角余弦(椭圆->旋弧 + 圆周率 / 2.0), vy = 椭圆->半高 * 三角正弦(椭圆->旋弧 + 圆周率 / 2.0);
    捌浮 宽 = 四舍五入(得到平方根(ux * ux + vx * vx)), 高 = 四舍五入(得到平方根(uy * uy + vy * vy));
    返回 修改矩形(输出, (肆整)(椭圆->横 - 宽), (肆整)(椭圆->纵 - 高), (肆整)(椭圆->横 + 宽), (肆整)(椭圆->纵 + 高));
}


肆狀 视程显露 是相交椭圆(手柄显场 显场, 手柄椭圆 椭1, 手柄椭圆 椭2) {
    若(!椭1 || !椭2) 返回 假;
    捌浮 横 = 椭1->横 - 椭2->横, 纵 = 椭1->纵 - 椭2->纵, 宽 = 椭1->半径 + 椭2->半径, 高 = 椭1->半高 + 椭2->半高;
    若(得到边長(横, 纵) > 宽) 返回 假;
    若(高 >= 宽 || (!椭1->旋弧 && !椭2->旋弧)) 返回(横 * 横) / (宽 * 宽) + (纵 * 纵) / (高 * 高) <= 1.0;
    若(是坐标在椭面(椭1->横, 椭1->纵, 椭2, 0) || 是坐标在椭面(椭2->横, 椭2->纵, 椭1, 0)) 返回 真;
    结构坐标 坐1, 坐2;
    得到椭圆坐标(椭1, 0, &坐1);        // 自转的椭圆使用边界直线检测法
    為(捌浮 甲 = 1; 甲 <= 8.0 && 得到椭圆坐标(椭1, (圆周率 / 8.0 * 甲) / 壹周弧, &坐2); 甲++, 坐1 = 坐2)
        若(是直线在椭面(制作直线(坐1.横, 坐1.纵, 坐2.横, 坐2.纵), 椭2, 0) ||
            是直线在椭面(制作直线(椭1->横 + 椭1->横 - 坐1.横, 椭1->纵 + 椭1->纵 - 坐1.纵,
                椭1->横 + 椭1->横 - 坐2.横, 椭1->纵 + 椭1->纵 - 坐2.纵), 椭2, 0)) 返回 真;
    返回 假;
}


肆狀 视程显露 框架椭圆(手柄显场 显场, 手柄椭圆 椭圆) {
    结构坐标 坐标;
    若(!显场 || !椭圆 || !得到椭圆坐标(椭圆, 0, &坐标)) 返回 假;
    移动直线(显场, 制作指向((肆整)坐标.横, (肆整)坐标.纵));
    為(捌浮 甲 = 0; 甲 <= 50.0 && 得到椭圆坐标(椭圆, 甲 / 50.0, &坐标); 甲++)
        绘制直线(显场, 制作指向((肆整)坐标.横, (肆整)坐标.纵));
    返回 真;
}


肆狀 视程显露 是矩形在椭圆(结构矩形 矩形, 手柄椭圆 椭圆, 手柄坐标 交点) {
    若(!椭圆 || 得到边長(椭圆->横 - ((捌浮)矩形.右 + 矩形.左) / 2.0, 椭圆->纵 - ((捌浮)矩形.底 + 矩形.顶) / 2.0) >=
        得到边長((捌浮)矩形.右 - 矩形.左, (捌浮)矩形.底 - 矩形.顶) / 2.0 + 椭圆->半径) 返回 假;
    返回 是指向矩形(制作指向((肆整)椭圆->横, (肆整)椭圆->纵), 矩形, 交点) ||
        是直线在椭面(制作直线(矩形.左, 矩形.顶, 矩形.右, 矩形.顶), 椭圆, 交点) ||
        是直线在椭面(制作直线(矩形.右, 矩形.顶, 矩形.右, 矩形.底), 椭圆, 交点) ||
        是直线在椭面(制作直线(矩形.右, 矩形.底, 矩形.左, 矩形.底), 椭圆, 交点) ||
        是直线在椭面(制作直线(矩形.左, 矩形.底, 矩形.左, 矩形.顶), 椭圆, 交点);
}


肆狀 视程显露 得到角形盒子(手柄角形 角形, 手柄矩形 输出) {
    若(!角形 || !输出) 返回 假;
    输出->左 = (肆整)得到最小(角形->横1, 角形->横2);
    若(角形->横3 < 输出->左) 输出->左 = (肆整)角形->横3;
    输出->顶 = (肆整)得到最小(角形->纵1, 角形->纵2);
    若(角形->纵3 < 输出->顶) 输出->顶 = (肆整)角形->纵3;
    输出->右 = (肆整)得到最大(角形->横1, 角形->横2);
    若(角形->横3 > 输出->右) 输出->右 = (肆整)角形->横3;
    输出->底 = (肆整)得到最大(角形->纵1, 角形->纵2);
    若(角形->纵3 > 输出->底) 输出->底 = (肆整)角形->纵3;
    返回 真;
}


捌浮 视程显露 得到角形周長(手柄角形 角形) {
    返回 角形 ? 得到边長(角形->横1 - 角形->横2, 角形->纵1 - 角形->纵2) +
        得到边長(角形->横2 - 角形->横3, 角形->纵2 - 角形->纵3) +
        得到边長(角形->横3 - 角形->横1, 角形->纵3 - 角形->纵1) : 0;
}


肆狀 视程显露 是角形在椭圆(手柄角形 角形, 手柄椭圆 椭圆, 手柄坐标 交点) {
    结构矩形 盒子;
    若(!椭圆 || !得到角形盒子(角形, &盒子) ||
        得到边長(椭圆->横 - ((捌浮)盒子.右 + 盒子.左) / 2.0, 椭圆->纵 - ((捌浮)盒子.底 + 盒子.顶) / 2.0) >=
        得到边長((捌浮)盒子.右 - 盒子.左, (捌浮)盒子.底 - 盒子.顶) / 2.0 + 椭圆->半径) 返回 假;
    返回 是坐标在角形(椭圆->横, 椭圆->纵, 角形, 得到角形面积(角形), 交点) ||
        是直线在椭面(制作直线(角形->横1, 角形->纵1, 角形->横2, 角形->纵2), 椭圆, 交点) ||
        是直线在椭面(制作直线(角形->横2, 角形->纵2, 角形->横3, 角形->纵3), 椭圆, 交点) ||
        是直线在椭面(制作直线(角形->横3, 角形->纵3, 角形->横1, 角形->纵1), 椭圆, 交点);
}


肆狀 视程显露 框架曲线(手柄显场 显场, 手柄曲线 曲线) {
    结构坐标 坐标;
    若(!显场 || !曲线 || !得到曲线坐标(曲线, 0, &坐标)) 返回 假;
    移动直线(显场, 制作指向((肆整)坐标.横, (肆整)坐标.纵));
    為(捌浮 甲 = 0; 甲 <= 50 && 得到曲线坐标(曲线, 甲 / 50, &坐标); 甲++)
        绘制直线(显场, 制作指向((肆整)坐标.横, (肆整)坐标.纵));
    返回 真;
}


肆狀 视程显露 得到曲线周期(捌浮 横, 捌浮 纵, 手柄曲线 曲线, 手柄捌浮 周1, 手柄捌浮 周2, 手柄捌浮 周3, 手柄捌浮 周4) {
    若(!曲线 || !周1 || !周2 || !周3 || !周4) 返回 假;        // 坐标在曲线的时间周期, 4个可能得到的解
    捌浮 A = 曲线->横3 + 曲线->横1 - 2.0 * 曲线->横2, B = 2.0 * (曲线->横2 - 曲线->横1), C = 曲线->横1 - 横, 根;
    若(A == 0 && B != 0)* 周1 = *周2 = -C / B;
    其它(根 = 得到平方根(B * B - 4.0 * A * C), *周1 = (-根 - B) / (2.0 * A), *周2 = (根 - B) / (2.0 * A));
    A = 曲线->纵3 + 曲线->纵1 - 2.0 * 曲线->纵2, B = 2.0 * (曲线->纵2 - 曲线->纵1), C = 曲线->纵1 - 纵;
    若(A == 0 && B != 0)* 周3 = *周4 = -C / B;
    其它(根 = 得到平方根(B * B - 4.0 * A * C), *周3 = (-根 - B) / (2.0 * A), *周4 = (根 - B) / (2.0 * A));
    返回 真;
}


肆狀 视程显露 是坐标在曲线(捌浮 横, 捌浮 纵, 手柄曲线 曲线, 手柄坐标 交点) {
    捌浮 周1, 周2, 周3, 周4;
    若(!曲线 || !是坐标在角形(横, 纵, (手柄角形)曲线, 得到角形面积((手柄角形)曲线), 0) ||
        !得到曲线周期(横, 纵, 曲线, &周1, &周2, &周3, &周4)) 返回 假;
    结构坐标 坐标;
    若(周1 >= 0 && 周1 <= 1.0 && 得到曲线坐标(曲线, 周1, &坐标) &&
        绝对捌浮(横 - 坐标.横) <= 最大公差 && 绝对捌浮(纵 - 坐标.纵) <= 最大公差) 返回 交点 ? (*交点 = 坐标, 真) : 真;
    若(周2 != 周1 && 周2 >= 0 && 周2 <= 1.0 && 得到曲线坐标(曲线, 周2, &坐标) &&
        绝对捌浮(横 - 坐标.横) <= 最大公差 && 绝对捌浮(纵 - 坐标.纵) <= 最大公差) 返回 交点 ? (*交点 = 坐标, 真) : 真;
    若(周3 != 周2 && 周3 != 周1 && 周3 >= 0 && 周3 <= 1.0 && 得到曲线坐标(曲线, 周3, &坐标) &&
        绝对捌浮(横 - 坐标.横) <= 最大公差 && 绝对捌浮(纵 - 坐标.纵) <= 最大公差) 返回 交点 ? (*交点 = 坐标, 真) : 真;
    若(周4 != 周3 && 周4 != 周2 && 周4 != 周1 && 周4 >= 0 && 周4 <= 1.0 && 得到曲线坐标(曲线, 周4, &坐标) &&
        绝对捌浮(横 - 坐标.横) <= 最大公差 && 绝对捌浮(纵 - 坐标.纵) <= 最大公差) 返回 交点 ? (*交点 = 坐标, 真) : 真;
    返回 假;
}


肆狀 视程显露 是坐标在曲面(捌浮 横, 捌浮 纵, 手柄曲线 曲线, 手柄坐标 交点) {
    捌浮 周1, 周2, 周3, 周4;
    若(!曲线 || !是坐标在角形(横, 纵, (手柄角形)曲线, 得到角形面积((手柄角形)曲线), 0) ||
        !得到曲线周期(横, 纵, 曲线, &周1, &周2, &周3, &周4)) 返回 假;
    结构坐标 坐3, 坐4;            // 坐标永远在無限周期3和4连接的直线
    返回 得到曲线坐标(曲线, 周3, &坐3) && 得到曲线坐标(曲线, 周4, &坐4) &&
        是坐标在直线(横, 纵, 制作直线(坐3.横, 坐3.纵, 坐4.横, 坐4.纵), 交点);
}


肆狀 视程显露 得到曲线盒子(手柄曲线 曲线, 手柄矩形 输出) {
    若(!曲线 || !输出) 返回 假;
    捌浮 周1 = (曲线->纵1 - 曲线->纵2) / (曲线->纵1 - 2.0 * 曲线->纵2 + 曲线->纵3);
    捌浮 周2 = (曲线->横1 - 曲线->横2) / (曲线->横1 - 2.0 * 曲线->横2 + 曲线->横3);
    结构坐标 坐1 = { 曲线->横1, 曲线->纵1 }, 坐2 = { 曲线->横3, 曲线->纵3 }, 坐3 = 坐1, 坐4 = 坐2;
    若(周1 >= 0 && 周1 <= 1.0) 得到曲线坐标(曲线, 周1, &坐1);
    若(周2 >= 0 && 周2 <= 1.0) 得到曲线坐标(曲线, 周2, &坐2);
    捌浮 小1 = 得到最小(坐1.横, 坐2.横), 小2 = 得到最小(坐3.横, 坐4.横);
    捌浮 大1 = 得到最大(坐1.横, 坐2.横), 大2 = 得到最大(坐3.横, 坐4.横);
    输出->左 = 得到最小(小1, 小2), 输出->右 = 得到最大(大1, 大2);
    小1 = 得到最小(坐1.纵, 坐2.纵), 小2 = 得到最小(坐3.纵, 坐4.纵);
    大1 = 得到最大(坐1.纵, 坐2.纵), 大2 = 得到最大(坐3.纵, 坐4.纵);
    输出->顶 = 得到最小(小1, 小2), 输出->底 = 得到最大(大1, 大2);
    返回 真;
}


// 曲线的平滑延長直线
肆狀 视程显露 得到曲线切线(手柄曲线 曲线, 捌浮 周期, 捌浮 長度, 手柄直线 输出) {
    结构坐标 坐标;
    若(!曲线 || !输出 || !長度 || !得到曲线坐标(曲线, 周期, &坐标)) 返回 假;
    捌浮 横 = 曲线->横1 * 2.0 * (1.0 - 周期) * (-1.0) + 曲线->横2 * 2.0 * ((1.0 - 周期) + (-1.0) * 周期) + 曲线->横3 * 2.0 * 周期;
    捌浮 纵 = 曲线->纵1 * 2.0 * (1.0 - 周期) * (-1.0) + 曲线->纵2 * 2.0 * ((1.0 - 周期) + (-1.0) * 周期) + 曲线->纵3 * 2.0 * 周期;
    捌浮 弧度 = 得到世界弧度(横, 纵), 宽 = 三角余弦(弧度) * 長度 / 2.0, 高 = 三角正弦(弧度) * 長度 / 2.0;
    输出->横1 = 坐标.横 + 宽, 输出->纵1 = 坐标.纵 + 高, 输出->横2 = 坐标.横 - 宽, 输出->纵2 = 坐标.纵 - 高;
    返回 真;
}


肆狀 视程显露 是直线在曲线(结构直线 直线, 手柄曲线 曲线, 手柄坐标 交点) {
    若(!曲线 || 是無效直线(&直线)) 返回 假;
    若(是坐标在曲线(直线.横1, 直线.纵1, 曲线, 交点) || 是坐标在曲线(直线.横2, 直线.纵2, 曲线, 交点)) 返回 真;
    结构坐标 坐1 = { 曲线->横1, 曲线->纵1 }, 坐2;        // 使用边界直线检测法
    為(捌浮 甲 = 1; 甲 <= 8.0 && 得到曲线坐标(曲线, 甲 / 8.0, &坐2); 甲++, 坐1 = 坐2)
        若(是相交直线(直线, 制作直线(坐1.横, 坐1.纵, 坐2.横, 坐2.纵), 交点)) 返回 真;
    返回 假;
}


肆狀 视程显露 是直线在曲面(结构直线 直线, 手柄曲线 曲线, 手柄坐标 交点) {
    若(!曲线) 返回 假;
    返回 是坐标在曲面(直线.横1, 直线.纵1, 曲线, 交点) || 是坐标在曲面(直线.横2, 直线.纵2, 曲线, 交点) ||
        是直线在曲线(直线, 曲线, 交点);
}


肆狀 视程显露 是曲面在椭面(手柄曲线 曲线, 手柄椭圆 椭圆, 手柄坐标 交点) {
    若(!曲线 || !椭圆 || !是角形在椭圆((手柄角形)曲线, 椭圆, 0)) 返回 假;
    若(是坐标在曲面(椭圆->横, 椭圆->纵, 曲线, 交点) || 是坐标在椭面(曲线->横1, 曲线->纵1, 椭圆, 交点) ||
        是坐标在椭面(曲线->横3, 曲线->纵3, 椭圆, 交点) ||
        是直线在椭面(制作直线(曲线->横1, 曲线->纵1, 曲线->横3, 曲线->纵3), 椭圆, 交点)) 返回 真;
    结构坐标 坐1 = { 曲线->横1, 曲线->纵1 }, 坐2;        // 使用边界直线检测法
    為(捌浮 甲 = 1; 甲 <= 8.0 && 得到曲线坐标(曲线, 甲 / 8.0, &坐2); 甲++, 坐1 = 坐2)
        若(是直线在椭面(制作直线(坐1.横, 坐1.纵, 坐2.横, 坐2.纵), 椭圆, 交点)) 返回 真;
    返回 假;
}


肆狀 视程显露 是曲面在矩形(手柄曲线 曲线, 结构矩形 矩形, 手柄坐标 交点) {
    若(!曲线) 返回 假;
    返回 是指向矩形(制作指向((肆整)曲线->横1, (肆整)曲线->纵1), 矩形, 交点) ||
        是指向矩形(制作指向((肆整)曲线->横3, (肆整)曲线->纵3), 矩形, 交点) ||
        是直线在曲面(制作直线(矩形.左, 矩形.顶, 矩形.右, 矩形.顶), 曲线, 交点) ||
        是直线在曲面(制作直线(矩形.右, 矩形.顶, 矩形.右, 矩形.底), 曲线, 交点) ||
        是直线在曲面(制作直线(矩形.右, 矩形.底, 矩形.左, 矩形.底), 曲线, 交点) ||
        是直线在曲面(制作直线(矩形.左, 矩形.底, 矩形.左, 矩形.顶), 曲线, 交点);
}


肆狀 视程显露 是曲面在角形(手柄曲线 曲线, 手柄角形 角形, 手柄坐标 交点) {
    捌浮 面积 = 得到角形面积(角形);
    若(!曲线 || !面积) 返回 假;
    返回 是坐标在角形(曲线->横1, 曲线->纵1, 角形, 面积, 交点) ||
        是坐标在角形(曲线->横3, 曲线->纵3, 角形, 面积, 交点) ||
        是直线在曲面(制作直线(角形->横1, 角形->纵1, 角形->横2, 角形->纵2), 曲线, 交点) ||
        是直线在曲面(制作直线(角形->横2, 角形->纵2, 角形->横3, 角形->纵3), 曲线, 交点) ||
        是直线在曲面(制作直线(角形->横3, 角形->纵3, 角形->横1, 角形->纵1), 曲线, 交点);
}



[此贴子已经被作者于2021-6-14 21:56编辑过]

2021-06-14 21:55
快速回复:两个不同形状的椭圆求交点有人会吗
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020563 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved