HDU 2857 Mirror and Light [计算几何]

本文介绍了一种算法,用于求解由直线反射得到的两个点的对称点。通过解析几何方法,详细阐述了如何求得对称点坐标及两直线交点,适用于计算机图形学、数学解题等领域。

#Description
给一条直线和两个点,这两个点是由那条直线反射得到,求反射的那个点
#Algorithm
求对称点
求两直线交点
#Code

#include <cstdio>
#include <cmath>
#include <iostream>

using namespace std;
const double eps = 1e-10;
double add (double a, double b)
{
  if (abs(a + b) < eps * (abs(a) + abs(b))) return 0;
  return a + b;
}
struct P
{
  double x, y;
  P(){}
  P(double x, double y):x(x),y(y){}
  P operator + (P p)
  {
    return P(add(x, p.x), add(y, p.y));
  }
  P operator - (P p)
  {
    return P(add(x, -p.x), add(y, -p.y));
  }
  P operator * (double d)
  {
    return P(x * d, y * d);
  }
};
double det(P p1, P p2)
{
  return add(p1.x * p2.y, -p1.y * p2.x);
}
bool g_equal(double a, double b)
{
  if (a > b - eps && a < b + eps) return true;
  return false;
}
//求p关于p1, p2所成直线的对称点
P symmetric_point(P p, P p1, P p2)
{
  //直线与x轴垂直
	if (g_equal(p1.x, p2.x)) return P(2 * p1.x - p.x, p.y);
  double k = (p1.y - p2.y ) / (p1.x - p2.x);
  if (g_equal(k, 0)) return P(p.x, 2 * p1.y - p.y);
  double x = (2*k*k*p1.x + 2*k*p.y - 2*k*p1.y - k*k*p.x + p.x) / (1 + k * k);
  double y = p.y - (x - p.x) / k;
  return P(x, y);
}
P intersection(P p1, P p2, P q1, P q2)
{
  return p1 + (p2 - p1) * (det(q2 - q1, q1 - p1) / det(q2 - q1, p2 - p1));
}
void solve()
{
  P p1, p2, ps, pe;
  cin >> p1.x >> p1.y >> p2.x >> p2.y >> ps.x >> ps.y >> pe.x >> pe.y;
  ps = symmetric_point(ps, p1, p2);
  P ans = intersection(p1, p2, ps, pe);
  printf("%.3lf %.3lf\n", ans.x, ans.y);
}
int main()
{
  int t;
  cin >> t;
  for (int i = 0; i < t; i++)
    solve();
}

根据原作 https://pan.quark.cn/s/0ed355622f0f 的源码改编 野火IM解决方案 野火IM是专业级即时通讯和实时音视频整体解决方案,由北京野火无限网络科技有限公司维护和支持。 主要特性有:私有部署安全可靠,性能强大,功能齐全,全平台支持,开源率高,部署运维简单,二次开发友好,方便与第三方系统对接或者嵌入现有系统中。 详细情况请参考在线文档。 主要包括一下项目: 野火IM Vue Electron Demo,演示如何将野火IM的能力集成到Vue Electron项目。 前置说明 本项目所使用的是需要付费的,价格请参考费用详情 支持试用,具体请看试用说明 本项目默认只能连接到官方服务,购买或申请试用之后,替换,即可连到自行部署的服务 分支说明 :基于开发,是未来的开发重心 :基于开发,进入维护模式,不再开发新功能,鉴于已经终止支持且不再维护,建议客户升级到版本 环境依赖 mac系统 最新版本的Xcode nodejs v18.19.0 npm v10.2.3 python 2.7.x git npm install -g node-gyp@8.3.0 windows系统 nodejs v18.19.0 python 2.7.x git npm 6.14.15 npm install --global --vs2019 --production windows-build-tools 本步安装windows开发环境的安装内容较多,如果网络情况不好可能需要等较长时间,选择早上网络较好时安装是个好的选择 或参考手动安装 windows-build-tools进行安装 npm install -g node-gyp@8.3.0 linux系统 nodej...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值