當前位置:首頁 » 操作系統 » 線條合並演算法

線條合並演算法

發布時間: 2022-08-11 04:02:38

① 空間線段對求交演算法

下面先介紹一種空間線段對求交演算法:

圖6.5 界線相交特性

三維地質建模方法及程序實現

空間兩條線段的求交運算是三維地質建模中使用頻率最高、演算法最簡單,同時也是最容易出現計算誤差,並導致後續建模失敗的數值運算之一。導致計算失敗的主要原因是計算精度與浮點數問題。例如,有3條線段,兩兩之間的交點距離非常近但不重合,如果保持3個交點不變就會降低後續建模中曲面網格的質量;如果降低精度要求,將3個交點合並成一點,就會影響與其他線段的相交關系。另外,浮點數問題在線段平行判斷、三點共線判斷、四點共面判斷都會遇到。在處理這類問題時,可以採用一個原則,即先精後粗,也就是說在線段對求交時盡量精確,等所有線段對求交結束後可以對距離很近的點進行合並處理。

② 界線的求交演算法

當需要進行求交運算的界線較少,且每條界線上的線段也不多時,逐一對分別來自兩條界線上的線段進行求交運算是可行的。但是,當界線很多時,這種求交方法將花費大量計算時間,效率十分低下。為此,本書將介紹一種演算法:先利用網格定位,盡可能排除不可能相交的線段對,然後逐一對可能相交的線段對進行求交運算。該方法的具體步驟如下:

(1)確定界線矩形包圍盒。將所有界線上的所有結點按坐標進行排序,找到最小與最大的三維坐標(xmin,ymin,zmin)與(xmax,ymax,zmax),作為矩形包圍盒的角點坐標。

(2)矩形包圍盒的網格劃分。以一定的間距,將包圍盒劃分成規則六面體格網,3個方向的間距可以不同,也可以相同。

(3)界線的網格定位,即確定每條界線上的每條線段與哪些網格單元相交,並將與某個網格單元相交的線段記錄在該單元的相交線段集上。線段與網格單元的相交判斷可以根據線段的端點坐標直接定位。

(4)組建可能相交的線段對。在每個格網單元中,將來自不同界線的線段進行組對,並刪除重復出現的線段對。

(5)線段對求交運算。

(6)結點的統一編排。將原有界線上的結點、界線的交點按坐標進行統一排序,按一定的閾值合並距離很近的結點,然後重新設置界線與新結點集中結點的關系。

(7)簡單弧的劃分。將每條界線劃分成若干簡單弧,保證每條簡單弧是唯一的,並且確保簡單弧上除端點以外的內部點不被其他簡單弧共享。簡單弧劃分方法見第7章線框架生成方法。

③ 試寫一個演算法合並這兩個線性鏈表為一個線性鏈表。在線等急!!過程截圖,要應用結果程序文件。

#include<iostream>
usingnamespacestd;

structtagClass1
{
tagClass1*pNext;
};

intCombineList(tagClass1*pListDest,tagClass1*pListSrc);

voidmain()
{
tagClass1*ptag1Head=NULL;
tagClass1*ptag2Head=NULL;

//中間省略鏈表賦值過程

CombineList(ptag1Head,ptag2Head);
}

intCombineList(tagClass1*pListDest,tagClass1*pListSrc)
{
if(NULL!=pListDest&&NULL!=pListSrc)
{
tagClass1*pTemp=pListDest;
while(NULL!=pTemp->pNext)
{
pTemp=pTemp->pNext;
}

tagClass1*pTemp2=pListSrc;
while(NULL!=pTemp2)
{
pTemp->pNext=pTemp2->pNext;
}
pTemp->pNext=NULL;

return1;
}

return0;
}

④ 數據結構如何合並兩個子圖

一種方法可以用hash法 也就是把子圖G1的結點先存進hash中 然後G2所有結點依次進行hash查找 如果找到 證明該結點是兩個圖公共結點 把他們的鄰接表合並 這樣可以得到所有結點的鄰接表 輸出即可

⑤ 我是一名計算機菜鳥,下面是數據結構演算法2.1合並線性表,錯誤百出,望高手指正修改,不要求用新方法,謝謝

不得不承認你是菜鳥。你的程序沒法改。缺很多東西。估計你是從《數據結構》或者類似的書上直接抄的吧?那都是偽碼,不是真正的C++程序。像你這個,ListLength、ListInsert、LocateElem等主要函數都沒有定義,能直接用嗎?建議樓主先去學好C和C++,再來學習這類課程,否則你永遠學不會。

⑥ 試寫一個演算法,將兩個有序線性表合並成一個有序線性表。

void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)
{
//已知單鏈線性表La和Lb的元素按非遞減排列
//歸並La和Lb得到新的單鏈線性表Lc,Lc的元素也按值非遞減排列
AH=La;BH=Lb;CH=Lc;
pa=AH_next;pb=BH_next;
CH=pc=AH;//用La的頭結點作為Lc的頭結點
while(pa&&pb)
{
if(pa->data<=pb->data){
pc-<next=pa;pc=pa;pa=pa->next;
}
elsr {pc->next=pb;pc=pb;pb=pb->next;}
}
pc->next=pa?pa:pb;//插入剩餘段
free(BH);//釋放Lb的頭結點
}//MergeList_L

⑦ 炒股的通達信軟體如何把20,30,60日均線和布林線合並設置為三條線

沒明白你說的意思,首先布林線的中線就是20日均線,布林上軌下軌是20日均線加減自身兩倍標准差算出來的,再加上30日和60日均線,一共5條線怎麼合並成3條啊,之間的演算法沒什麼關系啊。

⑧ 設線性表A=(a1,a2,…,am),B=(b1,b2,…,bn),試寫一個按下列規則合並A,B為線性表C的演算法,即使得

估計你是寫錯了LinkList pa,pb,qa,qb; 應該是 LinkList *pa,*pb,*qa,*qb;
Status ListMerge_L(LinkList &A,LinkList &B,LinkList &C)
{
LinkList *pa,*pb,*qa,*qb;
pa=A->next; //pa指向A的第二個節點,估計第一個節點沒數據
pb=B->next; //pb指向B的第二個節點
C=A;
while(pa&&pb){ //這個while就是循環啊,直到pa或pb指向NULL
qa=pa;
qb=pb;
pa=pa->next; //pa指向下一個節點
pb=pb->next; //pb指向下一個節點
qb->next=qa->next; //創建新鏈表在qb節點後面插入qa節點
qa->next=qb; //qa後面插入qb節點
}
//if(!pa)qb->next=pb; //應該寫錯了吧。
//pb=B;
if(!pa)qb->next=pa; //如果B比A短,B最後一個節點的next指針指向A剩下的
if(!pb)qa->next=pb; //如果A比B短,A最後一個節點的next指針指向B剩下的
free(pb);
return OK; //OK應該是你前面宏定義的吧,估計是#define OK 1
}

⑨ 求歸並排序演算法!

歸並排序。

1.這里,在把數組暫時復制到臨時數組時,將第二個子數組中的順序顛倒了一下。這樣,兩個子數組從兩端開始處理,使得他們互相成為另一個數組的「檢查哨」。 這個方法是由R.Sedgewick發明的歸並排序的優化。

2.在數組小於某一閥值時,不繼續歸並,而直接使用插入排序,提高效率。這里根據Record的結構,將閥值定位 16。

#define THRESHOLD 16

typedef struct _Record{
int data; //數據
int key; //鍵值
}Record;

//供用戶調用的排序 函數
void Sort(Record Array[], Record TempArray, int left, int right){
TwoWayMergeSort(Array, TempArray, left, right);
}

//歸並排序
void TwoWayMergeSort(Record Array[], Record TempArray[],
int left, int right)
{
if(right <= left) return; //如果只含一個元素,直接返回
if( right-left+1 ){ //如果序列長度大於閥值,繼續遞歸
int middle = (left + right)/2;
Sort(Array, TempArray, left, middle); //對左面進行遞歸
Sort(Array, TempArray, left, right, middle); //對右面進行遞歸
Merge(Array, TempArray, left, right, middle); //合並
}
else{
//如果序列長度小於閥值,採用直接插入排序,達到最佳效果
ImproveInsertSorter(&Array[left], right-left+1);
}
}

//歸並過程
void Merge(Record Array[], Record TempArray[],
int left, int right, int middle)
{
int index1, index2; //兩個子序列的起始位置
int k;

復制左邊的子序列
for(int i=1; i<=middle; i++){
TempArray[i] = Array[i];
}

//復制右邊的子序列,但順序顛倒過來
for(int j=1; j<=right-middle; j++){
TempArray[right-j+1] = Array[j+middle];
}

//開始歸並
for(index1=left, index2=right, k=left; k<=right; k++){
if(TempArray[index1].key<TempArray[index2].key){
Array[k] = TempArray[index++];
}
else{
Array[k] = TempArray[index2--];
}
}
}

//當長度小於閥值時 使用的直接插入排序的代碼
void ImproveInsertSorter(Record Array[], int size){
Record TempRecord; //臨時變數

for(int i=1; i<size; i++){
TempRecord = Array[i];
int j = i-1;
//從i開始往前尋找記錄i的正確位置
while(j>=0 && TempRecord.key<Array[j].key){
Array[j+1] = Array[j];
j = j-1;
}

Array[j+1] = TempRecord;
}
}

終於敲完了。。。 第一次回答問題, 只是覺得好玩`

熱點內容
壓縮皇冠 發布:2025-01-16 01:51:27 瀏覽:273
全鍵盤編程鍵盤 發布:2025-01-16 01:38:59 瀏覽:421
尾貨棉服直播間腳本 發布:2025-01-16 01:21:45 瀏覽:227
vb編程步驟 發布:2025-01-16 01:11:58 瀏覽:201
bb霜解壓 發布:2025-01-16 01:11:11 瀏覽:596
編程懟人 發布:2025-01-16 00:53:08 瀏覽:760
建立共享伺服器地址 發布:2025-01-16 00:26:40 瀏覽:565
android開機動畫修改 發布:2025-01-16 00:26:26 瀏覽:872
怎麼解壓pc版游戲 發布:2025-01-16 00:16:32 瀏覽:122
v9更新到91有方舟編譯器嗎 發布:2025-01-16 00:11:49 瀏覽:500