2015-08-28 37 views
3

我遇到了一個有些煩人的問題,在不知道正確的詞彙表的情況下難以解釋,但下面的兩個圖像應該解釋我在找什麼。在網絡中畫出點的影響

我有一個連接點的網絡。每個點都有一個顏色屬性。

Dot Network

網絡中的每個點表示,對於沒有更好的術語的,由相應的顏色「擁有」的位置。我現在想正常上展示其附近,即顏色「領土」的影響各擁有點有,通過產生一個類似於此:

Colored Dot Network

我看不到一個簡單的解決了這一點。我能看到的最可能的解決方案是生成一個平面,將有關每個點的信息傳遞給適當的着色器,並用它來計算平面的紋理。然而,與這個例子不同的是,不僅有10個點,而且可能在1000-2000之間。

要提出一些更爲具體的問題:

1)能着色器處理點(金額超過1000個)?

2)我不確定着色器必須具備哪種算法才能獲得正確的結果。遍歷所有點並將它們與所有剩餘的點進行比較並生成某種權重似乎是不理想的。我的背景是物理學,第一個本能就是產生類似於維格納 - 塞茨細胞的東西。 (我會提供一個圖片鏈接來解釋我的意思,但是看起來我只能用一個新帳戶發佈2個鏈接,但是快速的谷歌圖片搜索應該有很多好的結果)

3)顯而易見的一個問題:我錯過了一個微不足道的解決方案嗎?

+0

點是否會移動或改變其影響範圍?如果不是,則可以更高效地爲每個點生成一個相對於其直接相鄰點的影響多邊形,並根據需要更新每個多邊形的顏色。 – rutter

+0

@rutter他們不會相對於彼此移動,他們的關係也不會改變。每個點生成一個多邊形不是我以前考慮過的。雖然回想起來,我對Wigner-seitz細胞的第一本能就是這樣,所以也許它有優點 –

回答

1

這就是我要做的,創建一個所有點的數組和它們的位置,讓我們來談談這個問題,就像你將以統一的全屏模式運行它,然後創建一個新的數組來保存所有點的位置,我們希望以像素爲單位的世界位置。現在代碼如下:

Transform[] dots; 
Vector3[] position; //Vector2 is more appropriate because of 2D space but most of the Unity functions support only Vector3 

void Awake(){ 
    for(int i =0; i < dots.Length; i++) 
     position[i] = Camera.main.WorldToScreenPoint(dots[i].position); 
} 

現在我們在屏幕上有所有點的位置,接下來的事情就是創建實際的紋理。

Texture2D outTex = new Texture2D (Screen.height, Screen.width, TextureFormat.RGB24, false); 

現在我們應該遍歷這個紋理上的每個像素,並創建特定的公式來確定該像素應該是什麼顏色。

添加Color32類型的另一個數組變量,該變量將爲每個點定義顏色(由誰擁有)。

int h = outTex.height; 
int w = outTex.width; 
for (int i = 0; i < h; i++) 
    for (int j = 0; j < w; j++) { 
     //Formula for determining color is right here, here is my suggestion 
     //(the most simplest one), check the color of each dot and based on the distance 
     //between this pixel and dot's position determine how much influence that dot 
     //has on this pixel, here is how it goes 
     float red = 0; 
     float green = 0; 
     float blue = 0; 
     float divider = 0; 
     for(int c = 0; c < dots.Length; c++){ 
      float curDist = Vector3.Distance(dots[c].position, new Vector3(j, i ,0); 
      curDist = 1f/(curDist+1f); 
      red += dotColors[c].r * curDist; 
      green += dotColors[c].g * curDist; 
      blue += dotColors[c].b * curDist; 
      divider++; 
     } 
     outTex.SetPixel (j , i, new Color32(red/divider, green/divider, blue/divider, 255);  
    } 
outTex.Apply(); 

最後一部分會添加一些精靈,它具有整個屏幕的大小並將其應用到它。

所有這些只是給你一個基本的想法,你將如何去解決它,所有這些代碼沒有經過測試,所以你會prolly發現它的一些錯誤,但我把這個工作留給你。如果您在這裏發現任何問題並發表評論,我會回覆,因爲您提出了一個有趣的問題,我非常樂意幫助您。這讓我想起使用不同顏色的光源渲染白色2D紋理(這是你的點),所以試着在網上找到人們如何編寫2D光渲染的腳本,你會prolly找到一些有趣和有用的東西那裏。

+0

我已經採取了你的方法並改變了一下,所以不是將顏色混合在一起,而是使用任何顏色點最接近,它確實產生了我正在尋找的確切結果,但是......平均情況下有2000個點,紋理需要相當高的分辨率才能使結果看起來可以接受。即使3k * 3k紋理看起來不太好。有了這些數據,算法足以讓我在此期間做飯。我可以緩存結果,但它是保證隨時間變化的少數幾件事之一 –

+0

您可以向我發送生成的圖像或屏幕截圖嗎?我真的很感興趣,看看它看起來如何,但我沒有時間把它全部設置爲現在:)問題爲什麼需要這麼長時間是因爲「SetPixel」是非常緩慢和無效的,因爲每次你打電話它需要一個大量的內存和刪除所有它只是爲了設置一個像素的顏色,請嘗試使用「SetPixels」http://docs.unity3d.com/ScriptReference/Texture2D.SetPixels.html –

+0

[Here](http:// imgur .com/p8YEpHq)是它目前的樣子。我爲每個點分配了一個隨機顏色來進行測試,但它應該看起來完全符合我需要的方式,一旦每個點具有合適的顏色。我現在給SetPixels一個試試,並比較它與SetPixel相比花費的時間。 –