﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-王之昊在做计算几何-随笔分类-2：30</title><link>http://www.cppblog.com/Wangzhihao/category/14160.html</link><description>明白自己想做什么，做自己想做的事</description><language>zh-cn</language><lastBuildDate>Mon, 05 Jul 2010 07:02:43 GMT</lastBuildDate><pubDate>Mon, 05 Jul 2010 07:02:43 GMT</pubDate><ttl>60</ttl><item><title>Stars 坐标旋转</title><link>http://www.cppblog.com/Wangzhihao/archive/2010/07/03/119236.html</link><dc:creator>王之昊</dc:creator><author>王之昊</author><pubDate>Sat, 03 Jul 2010 03:00:00 GMT</pubDate><guid>http://www.cppblog.com/Wangzhihao/archive/2010/07/03/119236.html</guid><wfw:comment>http://www.cppblog.com/Wangzhihao/comments/119236.html</wfw:comment><comments>http://www.cppblog.com/Wangzhihao/archive/2010/07/03/119236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Wangzhihao/comments/commentRss/119236.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wangzhihao/services/trackbacks/119236.html</trackback:ping><description><![CDATA[<pre><br></pre>
<div style="text-align: center; font-size: 24pt;"><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1133">Stars</a><br><span style="font-size: 18pt;">
<div style="text-align: left;"><span style="font-family: 微软雅黑; font-size: 12pt;"><br><br>题意：</span><span style="font-size: 12pt; font-family: 微软雅黑;">给你一副星座地图，还有若干星座，对于每个星座，寻找他在地图中出现的次数。其中允许旋转和缩放，若某个星座在地图上的两个映射A，B所包含的点集是一样的，则A，B算一次。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大致思路是取出星座的第一，第二点，然后枚举这两个点在地图中的位置，将其他的点旋转过去检查是否合法。计算出次数S。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后在类似的计算出星座在自身中重复出现的次数B，最后答案为S / B<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>在具体实现上有几个问题：<br><br></span>
<ul style="font-family: 微软雅黑;">
    <li><span style="font-size: 12pt;">取整函数的写法：</span></li>
</ul>
<span style="font-size: 12pt; font-family: 微软雅黑;">double round(double d)</span><br style="font-family: 微软雅黑;"><span style="font-size: 12pt; font-family: 微软雅黑;">{<br>&nbsp;&nbsp;&nbsp; return floor(d + 0.5);<br>}</span><br style="font-family: 微软雅黑;">
<ul style="font-family: 微软雅黑;">
    <li><span style="font-size: 12pt;">最开始的速度很慢，分析原因有：</span></li>
</ul>
<span style="font-size: 14pt; font-family: 微软雅黑;">
<ol>
    <li><span style="font-size: 12pt;">用了vector，导致变慢， vector确实是慢了，改成数组 1000ms--&gt;204ms</span></li>
    <li><span style="font-size: 12pt;">用了map和set导致变慢，将map改成手写的hash，204ms--&gt;110ms</span></li>
</ol>
</span>
<ul style="font-family: 微软雅黑;"></ul>
    <ul>
        <li><span style="font-size: 12pt; font-family: 微软雅黑;">遇到段错误，结果发现是数组越界，数组越界有上越界（比如数组开小了）和下越界（比如下标为负）</span><br></li>
    </ul>
    </div>
    </span></div><img src ="http://www.cppblog.com/Wangzhihao/aggbug/119236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wangzhihao/" target="_blank">王之昊</a> 2010-07-03 11:00 <a href="http://www.cppblog.com/Wangzhihao/archive/2010/07/03/119236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Deformed Wheel 滚石头</title><link>http://www.cppblog.com/Wangzhihao/archive/2010/07/01/119103.html</link><dc:creator>王之昊</dc:creator><author>王之昊</author><pubDate>Thu, 01 Jul 2010 11:54:00 GMT</pubDate><guid>http://www.cppblog.com/Wangzhihao/archive/2010/07/01/119103.html</guid><wfw:comment>http://www.cppblog.com/Wangzhihao/comments/119103.html</wfw:comment><comments>http://www.cppblog.com/Wangzhihao/archive/2010/07/01/119103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Wangzhihao/comments/commentRss/119103.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wangzhihao/services/trackbacks/119103.html</trackback:ping><description><![CDATA[<a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1070">
<div style="text-align: center; font-size: 18pt;">Deformed Wheel</div>
</a><span style="font-weight: bold;"><br><br>题意：</span>给你一个斜面，再给一个凸多边形的石头，让石头从高出放下，沿着斜面滚动，问石头重心最后的位置。因为摩擦力很大，石头不能滑动，只能转动。（还有很多细节，具体见原题）<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先，这里要确定什么时候石头算稳定了，可以找到石头和斜面相交的两个点，一个是相对石头的最左点A，一个是相对石头的最右点B，这样如果石头要向左转动，必是绕着A转；要向右转动，必是绕着B转。这里有个问题，如果A，B的横坐标相同，那么A取最低的那个，B取最高的那个。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 找到A,B两点之后，如果重心G 有 A.x&lt;=G.x &lt;= B.x 那么他是稳定的，如果G.x &lt; A.x 那么他是向左转，如果G.x &gt; B.x那么他是向右转。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其次，要知道石头如果开始转动，不论向左向右，转动多少角度会再次碰到斜面。假设转动theta再次碰到斜面。我们要求出这个theta的值。这里可以采用二分theta的方法来解决，对于某个确定的角度theta1，直接模拟转动theta1角度。看是否超出斜面的范围，如果是，说明theta1大了，否则说明theta1小了。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二分的实现上我觉得还是有很多trick的，比如<br>
<ol>
    <li>在检查的时候，要检查石头上是否存在一点是否在斜面的下侧，这里很容易忽视那个支点，如果把支点也一并去检查，很可能因为精度的关系判他在斜面的下方，结果check函数一直都是不合法。</li>
    <li>向左转和向右转的处理上，向左转我采用的是二分［0，PI］转角，向右转我则是二分［-PI， 0］转角，结果写在一起就出问题了，向左转的判定如果在斜面下方，那么是角度大了，向右转的判定如果在斜面下方，实际上是角度小了，尽管绝对值是大了。还有一种写法是枚举［0，PI］，在check函数里再判断是向左转，还是向右转。这样不容易写错。</li>
</ol>
<br> <img src ="http://www.cppblog.com/Wangzhihao/aggbug/119103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wangzhihao/" target="_blank">王之昊</a> 2010-07-01 19:54 <a href="http://www.cppblog.com/Wangzhihao/archive/2010/07/01/119103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>