List<_obstacle> Ostacoli = new List<_obstacle>(); public struct _obstacle{ public int id; public int x; public int y; }
for(int i = 0; i < Ostacoli.Count; i++){ //Verifica if( Tizio_X >= Ostacoli[i].x && Tizio_X <= Ostacoli[i].x + 32 && Tizio_Y >= Ostacoli[i].y && Tizio_Y <= Ostacoli[i].y + 32){ // Collisione } }
Pseudo codiceIf Tizio.x+Tizio.w > Ostacolo.x And Tizio.x < Ostacolo.x+Ostacolo.w And Tizio.y+Tizio.h > Ostacolo.y And Tizio.y < Ostacolo.y+Ostacolo.h COLLISIONE EndIf
Citazione da: Thejuster - 21 Dicembre 2014, 11:40:44ho imparato ad alcuni di loro ad utilizzare perche' usi il verbo "imparare" in quel modo ?io ho imparato, tu hai imparato, essi hanno imparatonon ammette la forma "io ho imparato a te"io ho insegnato a te -> ti ho insegnato* * * * * * * * * * * * * * * * * * * * *ho insegnato ad alcuni di loro ad utilizzare* * * * * * * * * * * * * * * * * * * * *
ho imparato ad alcuni di loro ad utilizzare
unsafe private void GenerateNormalMap() { int x = 0, y = 0, kx = 0, ky = 0, src_stride = 0, dst_stride = 0, sumX = 128, sumY = 128, sumZ = 0; PixelData* p_src = null, p_dst = null; int[,] kernelX = new int[,] { { 1, 2, 1 }, { 0, 0, 0 }, { -1, -2, -1 } }; int[,] kernelY = new int[,] { { 1, 0, -1 }, { 2, 0, -2 }, { 1, 0, -1 } }; int[,] offsetX = new int[,] { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }; int[,] offsetY = new int[,] { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }; System.Drawing.Imaging.BitmapData bd_src = m_bmp_image.LockBits(new Rectangle(0, 0, m_bmp_image.Width, m_bmp_image.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); System.Drawing.Imaging.BitmapData bd_dst = m_bmp_nmap.LockBits(new Rectangle(0, 0, m_bmp_nmap.Width, m_bmp_nmap.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); p_src = (PixelData*)bd_src.Scan0.ToPointer(); p_dst = (PixelData*)bd_dst.Scan0.ToPointer(); src_stride = bd_src.Stride / 4; dst_stride = bd_dst.Stride / 4; for (y = 0; y < bd_src.Height; y++) { //Setto l'offeset dell'immagine ai margini if (y == 0) { offsetY[0, 0] = (bd_src.Height - 1) * src_stride; offsetY[1, 0] = (bd_src.Height - 1) * src_stride; offsetY[2, 0] = (bd_src.Height - 1) * src_stride; offsetY[0, 2] = 0; offsetY[1, 2] = 0; offsetY[2, 2] = 0; } else if (y == bd_src.Height - 1) { offsetY[0, 0] = 0; offsetY[1, 0] = 0; offsetY[2, 0] = 0; offsetY[0, 2] = -((bd_src.Height - 1) * src_stride); offsetY[1, 2] = -((bd_src.Height - 1) * src_stride); offsetY[2, 2] = -((bd_src.Height - 1) * src_stride); } else if (y == 1 || y == bd_src.Height - 2) { offsetY[0, 0] = 0; offsetY[1, 0] = 0; offsetY[2, 0] = 0; offsetY[0, 2] = 0; offsetY[1, 2] = 0; offsetY[2, 2] = 0; } for (x = 0; x < bd_src.Width; x++) { (p_dst + (y * dst_stride) + x)->a = 255; //Setto l'offset X dell'imagine ai margini if (x == 0) { offsetX[0, 0] = bd_src.Width - 1; offsetX[0, 1] = bd_src.Width - 1; offsetX[0, 2] = bd_src.Width - 1; offsetX[2, 0] = 0; offsetX[2, 1] = 0; offsetX[2, 2] = 0; } else if (x == bd_src.Width - 1) { offsetX[0, 0] = 0; offsetX[0, 1] = 0; offsetX[0, 2] = 0; offsetX[2, 0] = -bd_src.Width; offsetX[2, 1] = -bd_src.Width; offsetX[2, 2] = -bd_src.Width; } else if (x == 1 || x == bd_src.Width - 2) { offsetX[0, 0] = 0; offsetX[0, 1] = 0; offsetX[0, 2] = 0; offsetX[2, 0] = 0; offsetX[2, 1] = 0; offsetX[2, 2] = 0; } sumX = 128; for (kx = -1; kx <= 1; kx++) for (ky = -1; ky <= 1; ky++) sumX += kernelX[kx + 1, ky + 1] * (((p_src + (y * src_stride) + x + (ky * src_stride) + kx + offsetX[kx + 1, ky + 1] + offsetY[kx + 1, ky + 1])->r + (p_src + (y * src_stride) + x + (ky * src_stride) + kx + offsetX[kx + 1, ky + 1] + offsetY[kx + 1, ky + 1])->g + (p_src + (y * src_stride) + x + (ky * src_stride) + kx + offsetX[kx + 1, ky + 1] + offsetY[kx + 1, ky + 1])->b) / 3); sumY = 128; for (kx = -1; kx <= 1; kx++) for (ky = -1; ky <= 1; ky++) sumY += kernelY[kx + 1, ky + 1] * (((p_src + (y * src_stride) + x + (ky * src_stride) + kx + offsetX[kx + 1, ky + 1] + offsetY[kx + 1, ky + 1])->r + (p_src + (y * src_stride) + x + (ky * src_stride) + kx + offsetX[kx + 1, ky + 1] + offsetY[kx + 1, ky + 1])->g + (p_src + (y * src_stride) + x + (ky * src_stride) + kx + offsetX[kx + 1, ky + 1] + offsetY[kx + 1, ky + 1])->b) / 3); //Assegno il clamped X e sommo al canale R if (sumX < 0) (p_dst + (y * dst_stride) + x)->r = 0; else if (sumX > 255) (p_dst + (y * dst_stride) + x)->r = 255; else (p_dst + (y * dst_stride) + x)->r = (Byte)sumX; // Assign clamped Y sum to G channel if (sumY < 0) (p_dst + (y * dst_stride) + x)->g = 0; else if (sumY > 255) (p_dst + (y * dst_stride) + x)->g = 255; else (p_dst + (y * dst_stride) + x)->g = (Byte)sumY; //Calcolo e assegno il canale B al data sumZ = ((Math.Abs(sumX - 128) + Math.Abs(sumY - 128)) / 4); if (sumZ < 0) sumZ = 0; if (sumZ > 64) sumZ = 64; (p_dst + (y * dst_stride) + x)->b = (Byte)(255 - (Byte)sumZ); } } m_bmp_image.UnlockBits(bd_src); m_bmp_nmap.UnlockBits(bd_dst); }
L'algoritmo mi sembra corretto, è giusto che siano molto accentuate le normals. Per avere delle normal "realistiche" l'artista deve costruirsele a partire da un modello 3D, da cui verrà renderizzata una scena particolare contenente le normali per ciascun pixel (lo fanno tutti i programmi 3D). Se invece si parte da immagini, e per di più sono immagini "sintetiche" quindi non fotografiche e contenenti stacchi di colore netti, è assolutamente fisiologico che vengano fuori delle cose un po' brutte.Non ti preoccupare di questa cosa, lascia l'algoritmo così e al massimo lascia all'utente la possibilità di generarle o di importare delle normal maps esterne, così in caso se le sistema lui tramite il programma di grafica che preferisce.
@Thejuster non mi hai risposto, ma sotto hai un algoritmo di pathplanner ?il repo di questo progetto ?
...(1) un robot mobile si fa sempre 3 domande-1- dove sono ?-2- dove devo andare ?...