- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
-7-14更新[娱乐教程]用VC绘制你自己的箭头
[C++娱乐教程]用VC绘制你自己的箭头
Lightning[0GiNr]
BLOG:/Aegisys
BBS:http://bbs.0GiN/注:转载请声明作者,谢谢
在纸上绘制一支箭头或许是再简单不过的事情——你用不了两分钟的。但是你有没想过用VC + Win32 API在屏幕上绘制一个“精确”的箭头,就像右图中那样呢?
给定两个点A,O的坐标,要求绘制由O指向A的箭头,为简易起见,我们设,AC CD 15单位,∠BAC (即15度),那么我们只需要得到C、D和B的坐标就可以了。
初看起来比较简单,但是拿笔一算,运算量还不小——哦,至少对于我来说是不小。而且恼人的是你不得不考虑除数为0的情况。下面证明它是有多么令人恼火——如果你不想恼火的话可以直接略过它(它很长的):
当你不幸地学习过高中数学的解析几何部分后,我相信你会悲剧地去求AB和AD的斜率(不错,我就是这样悲剧的)。当时我熟练地从书上翻到了和角公式:
当然就是AO的斜率,我们定义的15度的正切值,就是AB的斜率了,同理就是AD的斜率——嗯,是的,一切都如此完美。实际上如果你这么写,数学老师一般会给你满分——个别老师会扣掉1分,极个别会扣掉2分。但是计算机会给你0分——因为CPU发现了如果是零的话,在计算AO斜率时会直接导致除数为0的情况导致出现异常——这时候用户就会听到清脆的叮呤一声——然后程序就崩溃了。
更令人沮丧的是,和的计算也存在除数为0的潜在问题。为了解决它,你不得不去验证每一次的分母并做出针对斜率不存在的特殊处理——这还不是最倒霉的。在计算AO斜率时,你需要一个浮点数来存储的值,于是在验证的算式中只否会存在除0情况时,麻烦来了——你不能用if dbValue 0.0 来判断是一个浮点数是否等于0(这是一个常识,参见浮点数的存储原理。当一个值小到足够小时就可以认为它的值为0),为此你需要定义一个精度范围……
至此,感谢你花费一些不必要的时间来阅读上面这段蓝色文字,相信你已经对这种方法感到绝望了。没关系,我们来看比较好的方法。
好的我们回到正题。上回说到了这个问题的题目,下面我们来看比较好的解决方法。为提高效率,这种方法尽量避开了使用浮点数(只在开平方的时候用了两下),变量定义得也不多,而且最重要的是不用考虑除数为0的情况!
我们先来计算C点的坐标。如果你认真写过中考时的数学卷子(什么?你没认真写过?),一定会发现本题中存在如下关系:
这是一个比例关系,利用了三角形的相似原理,相信我可以从右边的图(哦,还是那张)中找出是哪两个三角形……噢不,我好像没有画上那两个三角形……不过我相信你还是可以找到它的。
(其实用三角函数比较好理解,不过我觉得应该为尚在初中学习的同学着想一点——我又说废话了,大家华丽地无视我吧。)
将上式由题意(这三个字是万应灵药)去掉绝对值号(实际上可以用向量来推)后得:
由此我们算出了C点的坐标。细心的你会发现确保A和O不为同一点时,确实没有除以0的情况出现!——不过不要高兴得太早,B、D点的坐标应该怎么办呢?
很明显由于对称性(又一个写题时常用的蒙混过关的好词!),BD的连线垂直于AO,我们设垂足为K(求出K的坐标和求C是完全一样的问题,不再赘述),设D到K的水平距离为,垂直距离为(在图中已经标示,可以为负值)。如下的四个结论已经下降到了小学难度:
,,,
那么,如何计算和呢?其实方法我在描述C点的计算方法时就已经说过了,我们稍作变化:
,,
如果你理解起来有困难的话,请你思考如下几个问题: 1.在求C点时,分子上是x还是y是和所求的值是对应的——如求时分子是,为什么求的时候就不一样了呢? 2.是怎么来的?
如果你思考了以后仍然没有想法的话,你或许说你希望跳过这段,我赞同这点。因为我写出它们的真实目的是告诉大家:看,求和的过程和求C点的过程多么像!这意味着我们可以利用这些相似的地方减少我们的编码量和代码运算量。
读到这里,你一定有一个非常非常大的问题想问:你文章的标题不是说要用C++实现么,怎么我看了半天连半行代码也没看到! 哦,请你原谅一下,我写作文时基本是以跑题为主,飘移为辅的。所以我语文成绩一直不太好,不过还好,下面的代码部分不需要我和你有多高的语文水平……
嗯,在出示代码以前,我先介绍一种常用的定点数表示浮点数的技巧,这有助于你理解代码。
整数在进行除法等运算的时候不会保留小数部分,这是造成绝大多数人宁肯用double也不用int模拟实数的原因。但是目前为止,计算机处理整数还是比浮点数要快的。
如果计算的过程中有3除以5怎么办?这个方法告诉你,先把3乘以一个比较大的数,然后再除以5.在最终要整数结果的时候再把这个大数除掉的OK了。
比方说:a 是 3 / 5的运算结果; 求 c 14 * a。先取一个比
文档评论(0)