/// <summary> /// Creates view as voxeled circle. /// </summary> /// <param name="atlas"></param> private void CreateCircle(Texture2D atlas, int spriteOffset) { var atlasWidth = pixelsPerUnit * (int)((radius + 0.5) * 2); var atlasHeight = pixelsPerUnit * (int)((radius + 0.5) * 2); //every sprite is divided by specific 2D voxels(pixelsPerUnit, pixelsPerUnit) // __ __ __ // |__|__|__| // |__|__|__| // |__|__|__| var segmentsInRange = new bool[atlasHeight / pixelsPerUnit * atlasWidth / pixelsPerUnit]; var segmentXIndex = 0; var segmentYIndex = 0; var segment1DIndex = 0; for (var i = 0; i < atlasWidth; i++) { for (var j = 0; j < atlasHeight; j++) { segmentXIndex = i / pixelsPerUnit; segmentYIndex = j / pixelsPerUnit; segment1DIndex = segmentXIndex * atlasHeight / pixelsPerUnit + segmentYIndex; //skip previously visited segment if (segmentsInRange[segment1DIndex]) { continue; } //checking if current pixel coordinates are in raw range if (PixelCoor.Distance(new PixelCoor(i, j), new PixelCoor(atlasWidth / 2, atlasHeight / 2)) / pixelsPerUnit <= radius) { //marking segment as "visited" segmentsInRange[segment1DIndex] = true; //painting all pixels in visited segment // __ __ __ // |__|__|__| // ||||__|__| // ||||__|__| for (var x = segmentXIndex * pixelsPerUnit; x < segmentXIndex * pixelsPerUnit + pixelsPerUnit; x++) { for (var y = segmentYIndex * pixelsPerUnit; y < segmentYIndex * pixelsPerUnit + pixelsPerUnit; y++) { atlas.SetPixel(x + spriteOffset / 2, y + spriteOffset / 2, viewColor); } } } //set clear pixel if coordinates are out of range else { atlas.SetPixel(i + spriteOffset / 2, j + spriteOffset / 2, Color.clear); } } } atlas.Apply(); }
public static Vec2I ClosestPt(this RectInt rect, Vec2I pt) { Vec2I minPt = pt; float minDist = float.MaxValue; foreach (var tile in rect.allPositionsWithin) { float dist = Vec2I.Distance(pt, tile); if (dist < minDist) { minDist = dist; minPt = tile; } } return(minPt); }
private void ComputeInterPaths(int x, int y) { ATile tile = atiles[x, y]; for (int ea = 0; ea < 3; ++ea) { Edge edgeA = tile.edges[ea]; if (edgeA == null) { continue; } for (int eb = ea + 1; eb < 4; ++eb) { Edge edgeB = tile.edges[eb]; if (edgeB == null) { continue; } AStar.Path shortestPath = null; for (int a = 0; a < edgeA.pts.Length; ++a) { Vec2I ptA = edgeA.pts[a]; for (int b = 0; b < edgeB.pts.Length; ++b) { Vec2I ptB = edgeB.pts[b]; var path = AStar.FindPath( cacheInternal, ptA, tile.passFn, pt => pt == ptB, pt => Vec2I.Distance(ptB, pt)); if (shortestPath == null || path.g < shortestPath.g) { shortestPath = path; } } } tile.edges[ea].pathsToEdge[eb] = shortestPath; tile.edges[eb].pathsToEdge[ea] = shortestPath.Reversed(); } } }