程序员面试金典 16.13

本文介绍了一种名为BisectSquares的算法,该算法用于解决在二维平面上找到一条平分两个正方形的最长线段的问题。通过确定两个正方形的中心并找出它们之间的直线,算法能够计算出四条交点线,并最终选择长度最长且斜率最大的两条线段作为解决方案。文章详细介绍了如何处理斜率无限大和不同交点类型的情况。

Bisect Squares:给定两个正方形和一个二维平面,求一条平分两个正方形的最长线段,如果有多条线段,返回斜率最大的一条的两端点。

这条线段肯定过这两个正方形的中心,根据这两个中心确定一条直线,然后求4个交点,选择最远的两个就好了。

注意斜率为无穷大的问题,以及交点的求法。如果斜率在[-1, 1]之间,则交于正方形左右两边,如果斜率在[-∞, -1] ∪ [1, +∞],则交于正方形上下两边。

class Solution {
    const double EPS = 1e-6;
    struct Point
    {
        double x, y;
        Point(const vector<int> &square)
        {
            x = square[0] + square[2] / 2.0;
            y = square[1] + square[2] / 2.0;
        }
        Point(const double &x, const double &y) : x(x), y(y){}
    };
    bool equal(const double &d1, const double &d2)
    {
        return abs(d1 - d2) <= EPS;
    }
    Point extend(const Point &mid, const Point &other, const double &dir, const double &size)
    {
        double half = size / 2.0;
        if(equal(mid.x, other.x)){
            return Point(mid.x, mid.y + dir * half);
        }
        else{
            double slope = (other.y - mid.y) / (other.x - mid.x);
            if(abs(slope) < 1.0){
                return Point(mid.x + dir * half, mid.y + dir * half * slope);
            }
            else{
                return Point(mid.x + dir * half / slope, mid.y + dir * half);
            }
        }
    }
public:
    vector<double> cutSquares(vector<int>& square1, vector<int>& square2) {
        Point mid1(square1), mid2(square2);
        Point p11 = extend(mid1, mid2, -1.0, (double)square1[2]);
        Point p12 = extend(mid1, mid2, 1.0, (double)square1[2]);
        Point p21 = extend(mid2, mid1, -1.0, (double)square2[2]);
        Point p22 = extend(mid2, mid1, 1.0, (double)square2[2]);
        Point start = p11, end = p11;
        const vector<Point> vecPoints = {p12, p21, p22};
        for(size_t i = 0; i < vecPoints.size(); i++)
        {
            if(vecPoints[i].x < start.x || (equal(vecPoints[i].x, start.x) && vecPoints[i].y < start.y)){
                start = vecPoints[i];
            }
            else if(vecPoints[i].x > end.x || (equal(vecPoints[i].x, end.x) && vecPoints[i].y > end.y)){
                end = vecPoints[i];
            }
        }
        return {start.x, start.y, end.x, end.y};
    }
};
先看效果: https://renmaiwang.cn/s/jkhfz Hue系列产品将具备高度的个性化定制能力,并且借助内置红、蓝、绿三原色LED的灯泡,能够混合生成1600万种不同色彩的灯光。 整个操作流程完全由安装于iPhone上的应用程序进行管理。 这一创新举措为智能照明控制领域带来了新的启示,国内相关领域的从业者也积极投身于相关研究。 鉴于Hue产品采用WiFi无线连接方式,而国内WiFi网络尚未全面覆盖,本研究选择应用更为普及的蓝牙技术,通过手机蓝牙与单片机进行数据交互,进而产生可调节占空比的PWM信号,以此来控制LED驱动电路,实现LED的调光功能以及DIY调色方案。 本文重点阐述了一种基于手机蓝牙通信的LED灯设计方案,该方案受到飞利浦Hue智能灯泡的启发,但考虑到国内WiFi网络的覆盖限制,故而选用更为通用的蓝牙技术。 以下为相关技术细节的详尽介绍:1. **智能照明控制系统**:智能照明控制系统允许用户借助手机应用程序实现远程控制照明设备,提供个性化的调光及色彩调整功能。 飞利浦Hue作为行业领先者,通过红、蓝、绿三原色LED的混合,能够呈现1600万种颜色,实现了全面的定制化体验。 2. **蓝牙通信技术**:蓝牙技术是一种低成本、短距离的无线传输方案,工作于2.4GHz ISM频段,具备即插即用和强抗干扰能力。 蓝牙协议栈由硬件层和软件层构成,提供通用访问Profile、服务发现应用Profile以及串口Profiles等丰富功能,确保不同设备间的良好互操作性。 3. **脉冲宽度调制调光**:脉冲宽度调制(PWM)是一种高效能的调光方式,通过调节脉冲宽度来控制LED的亮度。 当PWM频率超过200Hz时,人眼无法察觉明显的闪烁现象。 占空比指的...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值