首页 > 其他分享 >【计算几何】Triangle Cillision 三角碰撞 [模型转化][二分]

【计算几何】Triangle Cillision 三角碰撞 [模型转化][二分]

时间:2024-04-24 14:34:55浏览次数:17  
标签:二分 const Point int double long return Triangle Cillision

题意

给定一个边长为L的三角形和一个直径非常微小的球,问球在三角形内与三角形的边第k次碰撞的时间

思路

模型转化:将碰撞转化为穿越
二分查找时间

code:

#include<bits/stdc++.h>
using namespace std;
const double eps=1e-7;
#define endl "\n"
#define int long long
struct Point{
	long double x,y;
	Point operator+(const Point &a) const {return {x+a.x,y+a.y};}
    Point operator-(const Point &a) const {return {x-a.x,y-a.y};}
    Point operator-() const {return {-x,-y};}
    Point operator*(const double k) const {return {k*x,k*y};}
    Point operator/(const double k) const {return {x/k,y/k};}
    double operator*(const Point &a) const {return x*a.x+y*a.y;} //Dot
    double operator^(const Point &a) const {return x*a.y-y*a.x;} //Cross

};
struct Line{
	Point p,v;
};

int L,k,x,y,vx,vy;
const long double sq3=sqrtl(3);
int _ceil(const double &x)
{
    long long k=ceil(x);
    while (k<x) k++;
    while (k>x+1) k--;
    return k;
}
int check(long double t){
	int res=0;
	Point lst={vx*t+x,vy*t+y};
	const long double c=sqrtl(3)*L;
	int k1=_ceil((lst.y+sq3*lst.x-c/2)/c);
	k1=abs(k1);
	int k2=_ceil((lst.y-sq3*lst.x-c/2)/c);
	k2=abs(k2);
	int k3=ceil(lst.y/(c/2));
	k3=abs(k3-1);
	return k1+k2+k3;
}
void sol(){
	cin>>L>>x>>y>>vx>>vy>>k;
	double l=0,r=1e15;
	long double ans;
	while(r-l>eps){
		long double mid=(l+r)/2;
		int cnt=check(mid);
		if(cnt>=k){
			r=mid;
			ans=mid;
		}
		else l=mid;
	}
	printf("%.6Lf\n",ans);
}
signed main(){
	int t;
	cin>>t;
	while(t--){
		sol();
	}
	return 0;
}

标签:二分,const,Point,int,double,long,return,Triangle,Cillision
From: https://www.cnblogs.com/muyi-meow/p/18155227

相关文章

  • P3667 Bovine Genomics Hash+二分题解
    砂金听说了你在学字符串,于是在CLOI里出了道题给你P3667BovineGenomics题链:洛谷hzoi提高\(hash\)基础题。思路是二分答案,\(check\)中比较每一个区间字串的\(hash\)值是否相等。比较的时候可以用\(set\)或\(map\)。\(set\)的好处在于无重元素,判断时先将\(a\)串中区间子串......
  • 整体二分
    主要思想:把多个询问一起解决(一次二分同时处理多个询问,确实顾名思义)记\([l,r]\)为答案的值域,\([L,R]\)为答案的定义域,\(mid=(l+r)/2\)。(也就是说求答案时仅考虑下标在\([L,R]\)内的操作和询问,这其中询问的答案在\([l,r]\)内)我们首先把所有操作按时间顺序存入数组中,然......
  • python --二分法学习
    deffound_number(need_vaule,l):print(l)mid_index=len(l)//2mid_value=l[mid_index]print("mid_valueis%s"%(mid_value))ifmid_value>need_vaule:l=l[:mid_index]print('needtofind1')......
  • P4423 / YC271A [ 20240411 CQYC省选模拟赛 T1 ] 三角形(triangle)
    题意给定\(n\)个点,求平面最小三角形周长。Sol其实挺简单一算法,一直没学。先随机转个∠,然后按照\(x\)排序。考虑分治。注意到分治左右两边的答案对当前可用的区间有限制。将满足限制的点按照\(y\)排序。这里可以归并做到一只\(log\)。然后集中注意力,发现对于每个点......
  • [dp 小计] wqs 二分
    天才算法!国外叫Alienstrick(外星人trick),真的太强了。其实是因为IOI2016Aliens这道题考了这个算法才开始普及。解决问题wqs二分一般用来解决如下问题。给定\(n\)个数,求强制选\(m\)个的价值最大。如果不是强制选\(m\)个,这类问题很好做。现在问题就是怎么取消......
  • 洛谷题单指南-动态规划1-P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles
    原题链接:https://www.luogu.com.cn/problem/P1216题意解读:计算数字三角形最高点到最后一行路径之和最大值,典型线性DP。解题思路:设a[i][j]表示数字三角形的值,设dp[i][j]表示从最高点到第i行第j列路径之和的最大值,由于每一步可以走到左下方的点也可以到达右下方的点,所以dp[i][......
  • 动态规划、回溯、BFS、二分、滑动窗口总结
    动态规划动态规划的核心问题:重叠子问题,最优子结构,状态转移方程动态规划与记忆递归的区别:记忆递归为自顶而上的递归剪枝,动态规划为自底向上的循环迭代;正确的状态转移方程+dp[]数组:确定状态(原问题和子问题中变化的变量)->确定dp数组的定义dp[i]->确定当前状态的'选择'并确定......
  • 二分图性质
    二分图独立集定义:在二分图\(G\)中选出点集\(S\)使得点集\(S\)中的点两两之间没有边相连。二分图最大独立集定义:在二分图\(G\)中选出点集\(S\)使得点集\(S\)中的点两两之间没有边相连,且使得不存在另一个二分图独立集\(S'\)使得\(|S'|>|S|\)。二分图最大独立集\(......
  • 「二分图」笔记
    二分图同时满足不存在奇数环和染色法不矛盾。二分图的判定:染色法#include<bits/stdc++.h>usingnamespacestd;constintN=1e3+10,M=2e6+10;struct{ intto,next;}e[M];inttop,h[N],color[N],n,m;voidadd(intx,inty){ e[++top]={y,h[x]};......
  • 【二分+容斥】【ST表/单调栈】【划分型DP】
    二分+容斥题目链接https://leetcode.cn/problems/kth-smallest-amount-with-single-denomination-combination/description/题目大意题目思路假设有一个x元硬币思考只有一种面额为3的硬币时,3可以组成不超过x的面额的数量有x/3种!思考有两种面额【3,6】,可以组成不......