平面点坐标最短距离计算请教

yh1205 2014-02-22 05:23:54
比如一个字母B,或者数字8,全部由单个像素点组成

B或者8在图片上的外轮廓坐标点全部已得到,一条像素点连续的闭合曲线,厚度1,存pt[n]坐标里

如何能算出8或B所有坐标点的最短距离,
或者也可说求出一个封闭曲线中最短距离坐标

要求能得到8或B中间腰斩的地方 左右两个点
谢谢!
...全文
631 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-02-25
  • 打赏
  • 举报
回复
1.求出所有点的外接矩形(要求该矩形的四条边相对整个画面的边框不是水平就是垂直),假定该外接矩形必然不是正方形,即一定有长和宽,且长>宽。 2.取外接矩形宽对应的一条边上的任一点A,再取外接矩形宽对应的另一条边上的任一点B 3.将所有点以A点和B点为间隔拆成两段。 4.求两段中距离最近的一对且大约位于中段(即忽略两段开始后和结束前若干个点)即题目所求。
xjtuzhw 2014-02-25
  • 打赏
  • 举报
回复
求腰围,嘿嘿 首先从相邻像素的切线方向的变化趋势确定出来折点位置,然后再从这些折点求取最近像素点
赵4老师 2014-02-24
  • 打赏
  • 举报
回复
我咋觉得应该是求两组坐标呢?不然肯定是0啊。
yh1205 2014-02-24
  • 打赏
  • 举报
回复
引用 2 楼 happyparrot 的回复:
还是没看明白你想要什么......
就是一个最简单的问题,有一组坐标x.y在数组CPoint pt[n]里,怎么通过若干次循环算出最短的直线距离(把最短距离的两个坐标点求出来)
快乐鹦鹉 2014-02-24
  • 打赏
  • 举报
回复
还是没看明白你想要什么......
bfdeh 2014-02-24
  • 打赏
  • 举报
回复
其实我还是不懂楼主在说什么
科学家 2014-02-24
  • 打赏
  • 举报
回复
我觉得还是要尽可能不两两球距离,否则运算量有点大。
科学家 2014-02-24
  • 打赏
  • 举报
回复
终于明白要什么了,楼主是求腰多细吧? 我瞎说一个想法: 1、先求最大距离的两点,然后,将这两点虚拟一条直线--分割线。将图形分割两半。 2、在垂直于这条分割线的两侧,逐对求距离,若发现有腰的变化规律(既然是腰,那么腰的特点是,就是距离先变细再变粗),则取最短时那俩点作为腰的两点。 不过两侧点分开的可能不成对。
许文君 2014-02-24
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
[quote=引用 9 楼 xuddk727 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 紧挨着的两个像素之间的距离我认为就是0 题目换成求最长距离的话才会有不同解。
他没说求紧邻两点的距离吧,说的明明是 ‘8’或‘B’中间两点之间的距离。[/quote] 无交点、无重合、单像素、闭合轮廓,在所有同一条水平线上的两点之间距离中最短的值为多少像素?[/quote] 我们俩认识上面好像有点不同,紧邻我认为距离应该为1,重合才为0,若如你14L这么算我觉得这样就没意义,我认为他的提问字面上理解可能有歧义。
赵4老师 2014-02-24
  • 打赏
  • 举报
回复
引用 14 楼 yh1205 的回复:
无交点、无重合、单像素、闭合轮廓, 不能保证最短距离在同一水平线上 可能有多个角度,都要能得到腰到的最短距离
我能想到的简单办法就是遍历0°~179°每隔1°旋转得到近似解。 说到腰部,就得排除两段开始后和结束前若干个点。 二维坐标旋转公式网上自己搜。
yh1205 2014-02-24
  • 打赏
  • 举报
回复
许文君 2014-02-24
  • 打赏
  • 举报
回复
引用 11 楼 yh1205 的回复:
[quote=引用 10 楼 xuddk727 的回复:] B的话猜测是否可以逐行扫描
逐行扫描的话可能对绝对水平方向也许可以 但是如果8旋转90度,变成无穷大的形状的怎么办,还有B或8可能按不同角度分布,可能带有一点角度,不见得正好是0度,或90度的旋转的 8 或 B只是打比喻,是说明物体像这些数字或字母,就是想知道这个物体他们腰部的两点最短距离在哪,外轮廓坐标都已经知道了存在pt[n] 下面我做的示例代码还像欠缺很多: n是数组的最大值 cd代表长度 min_cd代表最短长度,但是最后一遍下来的最短长度位置不对 for(i=1;i<=n/2;i++) { cd=sqrt((pt[i].x-pt[n-i].x)*(pt[i].x-pt[n-i].x)+(pt[i].y-pt[n-i].y)*(pt[i].y-pt[n-i].y)); if(cd<min_cd) { min_cd=cd; p1.x=pt[i].x; p1.y=pt[i].y; p2.x=pt[n-i].x; p2.y=pt[n-i].y; } }[/quote] 确实,那只能计算水平或垂直向的,扭曲无力
赵4老师 2014-02-24
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
[quote=引用 9 楼 xuddk727 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 紧挨着的两个像素之间的距离我认为就是0 题目换成求最长距离的话才会有不同解。
他没说求紧邻两点的距离吧,说的明明是 ‘8’或‘B’中间两点之间的距离。[/quote] 无交点、无重合、单像素、闭合轮廓,在所有同一条水平线上的两点之间距离中最短的值为多少像素?[/quote] 1.求出y坐标值最大的那个点,如果不唯一,任选其一,比如为第Ymax个点。 2.求出y坐标值最小的那个点,如果不唯一,任选其一,比如为第Ymin个点。 3.将所有点以第Ymax个点和第Ymin个点为间隔拆成两段。 4.求两段中y坐标相同的两点之间的x坐标值的差并统计出这些差的最小值即题目所求。
yh1205 2014-02-24
  • 打赏
  • 举报
回复
无交点、无重合、单像素、闭合轮廓, 不能保证最短距离在同一水平线上 可能有多个角度,都要能得到腰到的最短距离
yh1205 2014-02-24
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
[quote=引用 9 楼 xuddk727 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 紧挨着的两个像素之间的距离我认为就是0 题目换成求最长距离的话才会有不同解。
他没说求紧邻两点的距离吧,说的明明是 ‘8’或‘B’中间两点之间的距离。[/quote] 无交点、无重合、单像素、闭合轮廓,在所有同一条水平线上的两点之间距离中最短的值为多少像素?[/quote] 无交点、无重合、单像素、闭合轮廓, 不能保证最短距离在同一水平线上
赵4老师 2014-02-24
  • 打赏
  • 举报
回复
引用 9 楼 xuddk727 的回复:
[quote=引用 8 楼 zhao4zhong1 的回复:] 紧挨着的两个像素之间的距离我认为就是0 题目换成求最长距离的话才会有不同解。
他没说求紧邻两点的距离吧,说的明明是 ‘8’或‘B’中间两点之间的距离。[/quote] 无交点、无重合、单像素、闭合轮廓,在所有同一条水平线上的两点之间距离中最短的值为多少像素?
yh1205 2014-02-24
  • 打赏
  • 举报
回复
引用 10 楼 xuddk727 的回复:
B的话猜测是否可以逐行扫描
逐行扫描的话可能对绝对水平方向也许可以 但是如果8旋转90度,变成无穷大的形状的怎么办,还有B或8可能按不同角度分布,可能带有一点角度,不见得正好是0度,或90度的旋转的 8 或 B只是打比喻,是说明物体像这些数字或字母,就是想知道这个物体他们腰部的两点最短距离在哪,外轮廓坐标都已经知道了存在pt[n] 下面我做的示例代码还像欠缺很多: n是数组的最大值 cd代表长度 min_cd代表最短长度,但是最后一遍下来的最短长度位置不对 for(i=1;i<=n/2;i++) { cd=sqrt((pt[i].x-pt[n-i].x)*(pt[i].x-pt[n-i].x)+(pt[i].y-pt[n-i].y)*(pt[i].y-pt[n-i].y)); if(cd<min_cd) { min_cd=cd; p1.x=pt[i].x; p1.y=pt[i].y; p2.x=pt[n-i].x; p2.y=pt[n-i].y; } }
许文君 2014-02-24
  • 打赏
  • 举报
回复
B的话猜测是否可以逐行扫描
许文君 2014-02-24
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
紧挨着的两个像素之间的距离我认为就是0 题目换成求最长距离的话才会有不同解。
他没说求紧邻两点的距离吧,说的明明是 ‘8’或‘B’中间两点之间的距离。
赵4老师 2014-02-24
  • 打赏
  • 举报
回复
紧挨着的两个像素之间的距离我认为就是0 题目换成求最长距离的话才会有不同解。
加载更多回复(4)

16,549

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧