7.5 Given two squares on a two-dimensional plane, find a line that would cut these two squares in half. Assume that the top and the bottom sides of the square run parallel to the x-axis

这道题给了我们两个正方形,让我们求一条可以讲这两个正方形平均分为两个部分的直线,前提是两个正方形都和x轴平行。那么我们首先要知道啥样的直线才能将一个正方形平均分为两部分呢,答案是任意一条过正方形中心的直线,那么将两个正方形平均分为两部分就是连接两个正方形中心的直线。这道题需要我们建立多个类,点,直线,和正方形,是一道考察面向对象程序设计的好题目。其中点类由两个double型的变量表示,直线类由两个点类表示,正方形类由左上顶点和右下顶点还有边长表示。比较重要的两个子函数extend和cut,其中extend是求从一个中心连向另一个中心,且交另一个中心的外边缘的点,至于是内边缘还是外边缘由第三个参数的正负所决定。cut函数是求连接两个中心的直线分别和两个正方形的外边缘的交点,两点确定一条直线即可。可能作为读者的你会问,为啥这么麻烦,直接将两个中点一连不就是直线了,为啥要这么麻烦,这么装B。没错,楼主就是要带你装B带你飞,这解法是为了防止人家要求满足题意的线段,那么线段两个端点正好在正方形的边上,没错,就是这么拉风,参见代码如下:

class Point {
public:
double _x, _y;
Point(double x, double y): _x(x), _y(y) {};
}; class Line {
public:
Point _start, _end;
Line(Point start, Point end): _start(start), _end(end) {};
}; /*
(left, top)_________
| |
| | size
|_________|
(right, down)
*/
class Square {
public:
double _left, _top, _right, _down, _size;
Square(double left, double top, double right, double down, double size): _left(left), _top(top), _right(right), _down(down), _size(size) {};
Point middle() {
return Point((_left + _right) * 0.5, (_top + _down) * 0.5);
}
// Return the point whrere the line connecting mid1 and mid2 intercepts the edge of square 1.
Point extend(Point mid1, Point mid2, double size) {
double xdir = mid1._x < mid2._x ? - : ;
double ydir = mid1._y < mid2._y ? - : ;
if (mid1._x == mid2._x) return Point(mid1._x, mid1._y + ydir * size * 0.5);
double slope = (mid1._y - mid2._y) / (mid1._x - mid2._x);
double x1 = , y1 = ;
if (fabs(slope) == ) {
x1 = mid1._x + xdir * size * 0.5;
y1 = mid1._y + ydir * size * 0.5;
} else if (fabs(slope) < ) {
x1 = mid1._x + xdir * size * 0.5;
y1 = slope * (x1 - mid1._x) + mid1._y;
} else {
y1 = mid1._y + ydir * size * 0.5;
x1 = (y1 - mid1._y) / slope + mid1._x;
}
return Point(x1, y1);
}
// Calculate the line that connecting two mids
Line cut(Square other) {
Point p1 = extend(middle(), other.middle(), _size);
Point p2 = extend(middle(), other.middle(), - * _size);
Point p3 = extend(other.middle(), middle(), other._size);
Point p4 = extend(other.middle(), middle(), - * other._size);
Point start = p1, end = p1;
vector<Point> points = {p2, p3, p4};
for (int i = ;i < points.size(); ++i) {
if (points[i]._x < start._x || (points[i]._x == start._x && points[i]._y < start._y)) {
start = points[i];
} else if (points[i]._x > end._x || (points[i]._x == end._x && points[i]._y > end._y)) {
end = points[i];
}
}
return Line(start, end);
}
};

[CareerCup] 7.5 A Line Cut Two Squares in Half 平均分割两个正方形的直线的更多相关文章

  1. [CareerCup] 7.6 The Line Passes the Most Number of Points 经过最多点的直线

    7.6 Given a two-dimensional graph with points on it, find a line which passes the most number of poi ...

  2. codeforces 425D Sereja and Squares n个点构成多少个正方形

    输入n个点,问可以构成多少个正方形.n,xi,yi<=100,000. 刚看题的时候感觉好像以前见过╮(╯▽╰)╭最近越来越觉得以前见过的题偶尔就出现类似的,可是以前不努力啊,没做出来的没认真研 ...

  3. [LeetCode] Magic Squares In Grid 网格中的神奇正方形

    A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, co ...

  4. BZOJ 题目1036: [ZJOI2008]树的统计Count(Link Cut Tree,改动点权求两个最大值和最大值)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 8421  Solved: 3439 [Submi ...

  5. CareerCup All in One 题目汇总 (未完待续...)

    Chapter 1. Arrays and Strings 1.1 Unique Characters of a String 1.2 Reverse String 1.3 Permutation S ...

  6. CareerCup All in One 题目汇总

    Chapter 1. Arrays and Strings 1.1 Unique Characters of a String 1.2 Reverse String 1.3 Permutation S ...

  7. Shell split character line by line

    while read line      do            account=`echo "$line"| cut -c1-9`'|'            account ...

  8. poj3347 Kadj Squares【计算几何】

    Kadj Squares Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3594   Accepted: 1456 Desc ...

  9. shell中与运算 cut切分行 if while综合在一起的一个例子

    前言: 公司要统计 treasury库hive表磁盘空间,写了个脚本,如下: 查询hive仓库表占用hdfs文件大小: hadoop fs -du -h  /user/hive/warehouse/t ...

随机推荐

  1. CFString​Transform

    Mattt Thompson撰写. Ricky Tan翻译. 发布于2012年8月6日关于一种语言好不好用,你只需要衡量以下两种指标: API 的统一性String 类的实现质量NSString 是基 ...

  2. Handler、Looper、MessageQueue、Thread源码分析

    关于这几个之间的关系以及源码分析的文章应该挺多的了,不过既然学习了,还是觉得整理下,印象更深刻点,嗯,如果有错误的地方欢迎反馈. 转载请注明出处:http://www.cnblogs.com/John ...

  3. db2操作 连接、备份、恢复db2

    先deactivate后再start standby再primary报错不能启动hadr standby的时候,先restore,但是别rollback,直接start hadr as standby ...

  4. python代码学习day03-序列化学习pickle及json

    #!/usr/bin/env python #coding:utf8 import pickle,json import datetime dic1 = {'name':'alex', 'age':4 ...

  5. Docker 基础命令 简要入门

    本文出自:http://www.cnblogs.com/scoter2008,本文将持续更新所有docker都可以通过man查看帮助:man docker [ps|top|run|...]1.列出正在 ...

  6. (三)openwrt主Makefile解析

    本周成胖子每周一博到了第四周^_^ 前言 主Makefile结构 顶层 第二层 尾记 前言 前一篇,我们大概描述了整个镜像文件的生成过程.本周我们来解析主Makefile,看看主要编译过程是怎么产生的 ...

  7. hdu 敌兵布阵(线段树之单点更新)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  8. 基于jython操作hbase

    一.前言 关于jython介绍,直接上官网www.jython.org,可以得到详细资料,这里只介绍一下jython操作hbase的一些方法,本质上和用java操作hbase差不多,只不过语法换成了p ...

  9. [转]artDialog

    本文转自:http://aui.github.io/artDialog/ http://aui.github.io/artDialog/doc/index.html artDialog —— 经典的网 ...

  10. [转]How to insert a row between two rows in an existing excel with HSSF (Apache POI)

    本文转自:http://stackoverflow.com/questions/5785724/how-to-insert-a-row-between-two-rows-in-an-existing- ...