# task1 **Repository Path**: dannycheong/task1 ## Basic Information - **Project Name**: task1 - **Description**: task1 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-10-09 - **Last Updated**: 2022-10-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # **第一次大任务** 我把此次任务主体分为两块 - 生成符合要求的线段 - 成功分区并上色 --- ## **生成线段** 而生成线段又分成: 1. 确定点 2. 连线 ### **生成点** 大致思路: 1. 前三个点随机生成,并称为A,B,C点 2. 判断前三个点的连线所成的夹角为锐角还是钝角 - 若为锐角 1. 第四个点(称为D)与C点连线所成的线段与BC线段的夹角需要为 ***钝角*** - 若为钝角 1. 第四个点(称为D)与C点连线所成的线段与BC线段的夹角需要为 ***锐角*** ### **连线** 1. 生成点后连线需要不相交 - 这里用到了向量叉乘的相关定义,叉乘数值若为正则代表逆时针,反之则为顺时针 ![叉乘相关图片](task1_pic/cross.png) - 根据此定义 进行相关判断判断 1. 如下图,根据BA与BC的顺逆时针情况作判断,若BC为BA的逆时针方向,则为左边情况,反之为右边情况 2. 在此基础上,对于左边情况,只需要CD为BA的顺时针方向即可,右边则需要CD为BA的逆时针方向 ![顺逆时针图](/task1_pic/不相交判断.png) 先生成锐角的思路类似,就不多赘述了 至此,线段生成阶段结束 --- ## **分区并上色** ### **分区** 我把线段分成三个区域 ![分区](task1_pic/分区.png) 如图: 利用cos的正负 - 若为负,则在1区 - 若为正,则在23区 而在23区,利用AX向量的模长✖cos夹角是否大于AB向量的模长 - 若不是,则为2区 - 若是,则为3区 3区与1区则利用两点间距离公式即可求出距离,此外,我利用AX向量与AB向量叉乘的结果来赋予距离d正负号,以此可以把分侧也做好。 - 若在3区,如图 ![d](task1_pic/dcal.png) 把3区的距离按图中公式计算,由于公式包含叉乘,因此分侧也顺便完成了 此外,为了做到尾线段呈现射线的效果,我把尾线段的距离判断方式稍作修改,将3区和2区计算距离的方式统一,达到射线的效果。 完成以上工作后,只需遍历整个图像的每个像素点,并找动点与三条线段的距离的最小值,以此定为动点到整个折线段的距离 --- ### **上色** ``` img.at(i,j) = {175,uchar(abs_d_min*a),255}; img.at(i,j) = {110,uchar(abs_d_min*a),255}; ``` 上色部分直接就着代码解释,我利用HSV的颜色类型,如图 ![hsv](task1_pic/hsv.png) 对其中的S进行调整,以距离d为参数,最后转换为BGR类型进行输出,以达到越近越白的呈现效果 至此 大体思路展现完成 --- ## **效果呈现** - **效果1** ![效果1](task1_pic/效果1.png) - **效果2** ![效果2](task1_pic/效果2.png) 可以看到,效果并不完美,在锐角处总会出现一部分颜色混乱,对此我也没办法,因为问题出在我定义动点到线段距离的方式上,如图 ![explain](task1_pic/explain.png) 在此区域 点X与BC线段和AB线段的距离都为红线部分,但不同的是,对于AB线段而言,AX是顺时针的,对于BC线段而言,BX是逆时针的,这导致了距离d的正负冲突,因此会出现颜色混乱的区域,至于解决方法,还没想到QAQ --- 程序运行时间约900ms到1000ms (不知是否跟计算方式有关,运行时间颇长O.O) 程序按a可刷新结果,按q可退出程序