3994 光線追蹤(raytracing)

2021-08-30 02:46:09 字數 2479 閱讀 7513

考慮乙個二維平面,攝像機在(0,0)(0,0)的位置,初始時平面上沒有障礙物。現在執行qq次操作,操作有兩種(假設這是第ii次操作,1≤i≤q1≤i≤q):

1、給定x0,y0,x1,y1(x0

2、給定向量(x,y)(x,y),會有乙個動點從攝像機所在的(0,0)(0,0)位置出發,以(x,y)(x,y)所指的方向前進,直到碰到第乙個障礙物為止。

對於第2種操作,輸出最先碰到的障礙物的編號。若不會碰到任何障礙物,輸出0。

輸入檔案第一行乙個正整數qq,表示操作總數。

接下來的qq行,每行第乙個正整數opiopi為操作種類(保證為1或2)。如果為1,則接下來四個正整數x0,y0,x1,y1(x0

輸出檔案包含rr行(rr為第2種操作的總數),每行乙個正整數,表示第乙個碰到的障礙物編號。

10

1 3 3 10 4

1 4 2 5 6

2 6 2

1 2 8 4 10

1 0 6 3 9

2 5 2

2 8 6

2 2 9

2 4 7

1 5 7 10 10

122

50

樣例2

樣例解釋

在9次操作之後,平面的一部分如圖所示(箭頭為所有第2種操作詢問的路線)。

資料範圍

對於30% 的資料:q≤1000q≤1000。

對於另外30% 的資料:0≤x0,y0,x1,y1,x,y≤2000≤x0,y0,x1,y1,x,y≤200。

對於100% 的資料:q≤105,0≤x0,y0,x1,y1,x,y≤109,x0

noip2018模擬-南外

題解:乙個障礙物可以擋住乙個範圍以內的斜率,依照這個,我們可以以斜率為下標建立乙個線段樹,裡面維護的是斜率為k第乙個遇到的障礙物編號。然而我們可能交乙個障礙物於側面或者下面,所以要把橫縱座標分開維護,開兩個線段樹維護,具體實現比較繁瑣,**實現能力有待提高。。。。。。。

#include#include#include#include#include#define eps 1e-6

using namespace std;

typedef double db;

mapdk;

struct nodes[100005];

struct nodetre1[1200005],tre2[1200005];

//1 x 2 y

int q,tot,cnt,iid,mx,my;double xl[500005],vv;

void build(int k,int l,int r)

void update1(int k,int l,int r,int v,int id)

int mid=tre1[k].l+tre1[k].r>>1;

if(l<=mid)update1(k*2,l,r,v,id);

if(r>mid)update1(k*2+1,l,r,v,id);

}void update2(int k,int l,int r,int v,int id)

int mid=tre2[k].l+tre2[k].r>>1;

if(l<=mid)update2(k*2,l,r,v,id);

if(r>mid)update2(k*2+1,l,r,v,id);

}void ask1(int k,int t)

void ask2(int k,int t)

int main()

else

}sort(xl+1,xl+1+tot);

for(int i=1;i<=tot;++i)if(!dk[xl[i]])dk[xl[i]]=++cnt;

build(1,1,cnt);

for(int i=1;i<=q;++i)

if(!s[i].y0)

}else

double t=dk[atan2(s[i].y0,s[i].x0)];

int iid1,iid2;double xx,kk=(db)s[i].y0/s[i].x0;

vv=1e18;iid=0;ask1(1,t);

iid1=iid;xx=(db)vv;

vv=1e18;iid=0;ask2(1,t);

iid2=iid;

if(!iid1||!iid2)

int ans;

vv/=kk;

/*if(vv-xx>-eps)ans=iid1;

else if(xx-vv>-eps)ans=iid2;

else ans=max(iid1,iid2);*/

if(vv>xx||(fabs(vv-xx)iid2)) ans=iid1;

else ans=iid2;

printf("%d\n",ans);}}

}

光線追蹤(raytracing)

考慮乙個二維平面,攝像機在 0,0 0,0 的位置,初始時平面上沒有障礙物。現在執行qq次操作,操作有兩種 假設這是第ii次操作,1 i q1 i q 1 給定x0,y0,x1,y1 x0 2 給定向量 x,y x,y 會有乙個動點從攝像機所在的 0,0 0,0 位置出發,以 x,y x,y 所指的...

光線追蹤(raytracing)

考慮乙個二維平面,攝像機在 0,0 0,0 的位置,初始時平面上沒有障礙物。現在執行qq次操作,操作有兩種 假設這是第ii次操作,1 i q1 i q 1 給定x0,y0,x1,y1 x0 2 給定向量 x,y x,y 會有乙個動點從攝像機所在的 0,0 0,0 位置出發,以 x,y x,y 所指的...

實現光線追蹤

參考文章 作者正大三,剛好選修到計算機圖形學這門課,基於興趣,便試著實現全域性光照的效果,由此,寫下此篇文章。所謂光線追蹤,是指從眼睛出發,經過影象平面每一畫素,投射光線到場景中,求該光線與場景中幾何圖形的最近交點,然後求該交點的顏色屬性,並將該顏色值記錄下來,再根據相交點的材質判斷性地進行反射 折...