HDU 2912

直線關于球的多次反射,求最后一次反射點

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>using namespace std;
const double inf=1e10;
const double eps=1e-8;
struct point {double x,y,z;
//    point (double _x,double _y,double _z){ x=_x; y=_y; z=_z; };
};
struct sphe {point cent;double r;
};
struct vect {point st,des;
};
sphe cir[110];vect livc;
int n;point operator -(const point &u,const point &v){point ret;ret.x=u.x-v.x; ret.y=u.y-v.y; ret.z=u.z-v.z;return ret;
}double dot(point x,point y){return x.x*y.x+x.y*y.y+x.z*y.z;
}point xmulti(point u,point v){point ret;ret.x=(u.y*v.z-v.y*u.z);ret.y=(u.z*v.x-u.x*v.z);ret.z=(u.x*v.y-u.y*v.x);return ret;
}double dis(point x,point y){return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y)+(x.z-y.z)*(x.z-y.z));
}double vlen(point x){return sqrt(x.x*x.x+x.y*x.y+x.z*x.z);
}point  construct(){point crop;crop.x=crop.y=crop.z=0;double stoc=inf; point tmpcrop; point foot,tmpfoot; bool flag; point tmp; int k;while(true){flag=false; stoc=inf;for(int i=0;i<n;i++){if(dot(livc.des-livc.st,cir[i].cent-livc.st)>=-eps){//判斷圓是否與直線同向,通過點積判方向 double D=vlen(xmulti(livc.des-livc.st,cir[i].cent-livc.st))/dis(livc.st,livc.des);  //    cout<<D<<' '<<i<<endl;if(D-cir[i].r<=eps){       //半徑小于D,相交 flag=true;//    cout<<"YES"<<endl;double u=dot(cir[i].cent-livc.st,livc.des-livc.st)/(dis(livc.st,livc.des)*dis(livc.st,livc.des));//計算垂足。可通過向量的比例所得方程,聯合垂直點積為0的方程解得 tmpfoot=livc.st;tmpfoot.x+=u*(livc.des.x-livc.st.x);tmpfoot.y+=u*(livc.des.y-livc.st.y);tmpfoot.z+=u*(livc.des.z-livc.st.z);//    cout<<tmpfoot.x<<' '<<tmpfoot.y<<' '<<tmpfoot.z<<' '<<endl;u=sqrt((cir[i].r*cir[i].r-D*D))/dis(livc.st,livc.des);  //計算交點。垂足到圓上交點方向與直線反方向相同//通過兩者距離比計算出向量的轉化 tmpcrop=tmpfoot;tmp=livc.st-livc.des;tmpcrop.x+=tmp.x*u;tmpcrop.y+=tmp.y*u;tmpcrop.z+=tmp.z*u;D=dis(tmpcrop,livc.st);//    cout<<D<<endl;if(D<stoc){     //若與多個圓相交,選取較近的一個 stoc=D; crop=tmpcrop;k=i;}}}}if(!flag) return crop;double tu=dot(livc.st-cir[k].cent,crop-cir[k].cent)/(dis(crop,cir[k].cent)*dis(crop,cir[k].cent));tmpfoot=cir[k].cent;     //計算反射線。直線st點關于交點與球心的直線 對稱點作為反射線的des點 tmpfoot.x+=tu*(crop.x-cir[k].cent.x);tmpfoot.y+=tu*(crop.y-cir[k].cent.y);tmpfoot.z+=tu*(crop.z-cir[k].cent.z);    //知直線st點到反射線des點的方向與st點到關于對稱線垂足方向相同且為兩倍 livc.des.x=((tmpfoot.x-livc.st.x)*2+livc.st.x);  //通過這樣可以求對稱點 livc.des.y=((tmpfoot.y-livc.st.y)*2+livc.st.y);livc.des.z=((tmpfoot.z-livc.st.z)*2+livc.st.z);livc.st=crop;//    cout<<livc.des.x<<' '<<livc.des.x<<' '<<livc.des.x<<endl;}
}int main(){point tmp; double r;while(scanf("%d",&n),n){livc.st.x=livc.st.y=livc.st.z=0;scanf("%lf%lf%lf",&tmp.x,&tmp.y,&tmp.z);livc.des=tmp;for(int i=0;i<n;i++){scanf("%lf%lf%lf%lf",&cir[i].cent.x,&cir[i].cent.y,&cir[i].cent.z,&cir[i].r);}tmp=construct();printf("%.4lf %.4lf %.4lf\n",tmp.x,tmp.y,tmp.z);}
}

  

轉載于:https://www.cnblogs.com/jie-dcai/p/3902389.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273633.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273633.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273633.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

EMVTag系列3《持卡人基本信息數據》

9F61 持卡人證件號 L&#xff1a;2–26 R&#xff08;需求&#xff09;&#xff1a;數據應存在&#xff0c;在讀應用數據過程中&#xff0c;終端不檢查&#xff1b; (PBOC2.0第五部分中規定)芯片中持卡人姓名 5F20與持卡人姓名擴展9F0B只能使用一個&#xff0c;另一個必須不…

BindingException: Parameter 'XXX' not found. Available parameters are [collection, list]

應業務需求&#xff0c;需要使用到MQ進行數據上傳和下發。傳遞格式為JSON,服務那邊下發JSON數組&#xff0c;接收端將JSON數組轉換成List集合&#xff0c;調用Mybatis-plus批量添加saveBatch()。提示字段未找到... org.apache.ibatis.exceptions.PersistenceException: ### Er…

JDK 8 新特性 之 default關鍵字

前言 Jdk1.8之前的接口中只聲明方法&#xff0c;方法具體實現應在子類中進行。Jdk1.8打破了這樣的用法&#xff1a;接口中可以實現具體的方法體&#xff0c;只需要加上關鍵字static或者default修飾即可。 default關鍵字 public interface UserService {//自定義方法void getUse…

headroom.js插件使用方法

1.什么是headroom.js&#xff1f; headroom是用純Javascript寫的插件&#xff0c;用來隱藏和展示頁面元素&#xff0c;從而為頁面留下更多空間。比如使用headroom能使導航欄當頁面下滾時消失&#xff0c;當頁面上滾時候又出現。&#xff08;查看效果&#xff09; 2.工作原理 通…

JDK 8 新特性 之 方法引用

概述 方法引用&#xff1a;當要傳遞給Lambda體的操作&#xff0c;已經有實現的方法了&#xff0c;就可以使用方法引用方法引用&#xff1a;在Lambda的基礎上進一步的簡化。換句話說&#xff0c;方法引用就是Lambda表達式&#xff0c;也就是函數式接口的一個實例&#xff0c;通過…

項目記錄:springmvc forward redirect 問題

RequestMapping("/redirect")public String redirect(RedirectAttributes redirectAttributes){redirectAttributes.addFlashAttribute("test", "testdata"); //專供此種情況下使用。return "redirect:read";} 注意&#xff1a;此種情…

JDK 8 新特性 之 Lambda表達式

前言 Lambda 表達式&#xff0c;也可稱為閉包&#xff0c;它是推動 Java 8 發布的最重要新特性。Lambda 允許把函數作為參數傳遞進方法中。使用 Lambda 表達式可以使代碼變的更加簡潔緊湊。lambda表達式的重要特征: 可選類型聲明&#xff1a;不需要聲明參數類型&#xff0c;編譯…

開源組件DocX導出Word

1、使用Docx替換Word模板里書簽里內容的一個方法 using Novacode;public class ExportWord{/// <summary>/// 導出word/// </summary>/// <param name"lBookMarks">書簽數據源</param>/// <param name"sTemplatePath">導出W…

JDK 8 新特性 之 Strams簡單使用

概述 Java 8 API添加了一個新的抽象稱為流Stream&#xff0c;可以讓你以一種聲明的方式處理數據。 Stream 使用一種類似用 SQL 語句從數據庫查詢數據的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。 Stream API可以極大提供Java程序員的生產力&#xff0c;讓程序員寫出…

Cannot open include file: jni.h: No such file or directory解決方法

在此運行Visual Studio 2012 項目時出現 #include <stdio.h> #include <jni.h> int main() { printf("Hello World"); } But when I try to build, I get the following error - 1>c:testtest.cpp(2) : fatal error C1083: Cannot open include file:…

JDK 8 新特性 之 函數接口

函數接口 定義:接口中只有唯一的一個抽象方法&#xff0c;該接口就稱之為函數接口。 //函數接口 public interface FunctionInterface1 {//1、只有一個方法的接口&#xff0c;默認稱之為函數接口void get(); }//非函數接口 public interface FunctionInterface2 {void get1();v…

微服務之基礎知識

什么是微服務架構 微服務是系統架構上的一種設計風格&#xff0c; 它的主旨是將一個原本獨立的系統拆分成多個小型服務&#xff0c;這些小型服務都在各自獨立的進程中運行&#xff0c;服務之間通過基于HTTP的RESTful API進行通信協作。 被拆分成的每一個小型服務都圍繞著系統中…

LightOj 1078 Basic Math

思路&#xff1a; 設輸入的兩個數分別為n和a,每一次所得到的數為update&#xff1a; 開始updatea,依次update分別為update*10a,這樣數據會超出范圍&#xff0c;則update每次為update(update*10a)%n即可&#xff0c; 如果update0,跳出循環&#xff1b; 只需證明&#xff1a;(upd…

還是俄羅斯方塊之android版

前面的&#xff0c;口水話 請直接跳過。 雖然現在不比以前了 也沒多少人氣了&#xff0c;放到首頁 都不到幾百的點擊量。也許博客園整體水平也是在往水的方向發展。不談那些了&#xff0c;哥也曾經輝煌過 有過一天上千的點擊量 &#xff0c;哥也曾經有過粉絲&#xff0c;被小妹…

Integer 值判斷相等

Integer 值判斷相等 案例&#xff1a; public class Test {public static void main(String[] args) {Integer a 127;Integer b 127;System.out.println("a b :" (a b));System.out.println("a.equals(b):"a.equals(b));String x "127";Str…

自定義快捷命令程序(VC++加批處理)

一 概述 在看《從小工到專家-程序員修煉之道》時&#xff0c;看到建議使用Shell&#xff0c;很有感觸。在很多時候&#xff0c;通過鍵盤操作&#xff0c;比鼠標的確會塊很多&#xff0c;如果能用好shell命令&#xff08;或批處理命令&#xff09; &#xff0c;的確能節省我們…

Redis 快速入門

簡介 Redis 是一個 Key-Value 存儲系統。和 Memcached 類似&#xff0c;它支持存儲的 value 類型相對更多&#xff0c;包括 string(字符串)、 list(鏈表)、 set(集合)和 zset(有序集合)。這些數據類型都支持 push/pop、add/remove 及取交集并集和差集及更豐富的操作&#xff0c…

7. Adapter

轉載于:https://www.cnblogs.com/anit/p/3930202.html

Redis 中常用命令

Redis 中常用命令 keys 返回滿足給定 pattern 的所有 key。 127.0.0.1:6379> keys *1) "name2"2) "myzset"3) "myset7"4) "name"5) "myset6"6) "mylist"7) "mylist2"8) "myset3"9) "…

CGI與Servlet的區別和聯系

1. 定義&#xff1a; CGI(Common Gateway Interface 公共網關接口)是HTTP服務器與你的或其它機器上的程序進行“交談”的一種工具&#xff0c;其程序須運行在網絡服務器上。 2. 功能&#xff1a; 絕大多數的CGI程序被用來解釋處理杰自表單的輸入信息&#xff0c;并在服 務器產生…