| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- using o0;
- using o0InfraredLocate.ZIM;
- using System;
- using System.Collections.Generic;
- using System.Threading.Tasks;
- using Unity.VisualScripting;
- using UnityEngine;
- using ZIM.Unity;
- using Color = UnityEngine.Color;
- namespace ZIM
- {
- internal class PixelArea
- {
- public static int gridLength = 16;
- //public static (int x, int y) gridSize;
- public static (int x, int y) GetGrid(Vector2 v)
- {
- var m = (int)(v.x / gridLength);
- var n = (int)(v.y / gridLength);
- return (m, n);
- }
- public static List<(double cos, double sin)> AngleMathList {
- get
- {
- if (angleMathList != null)
- return angleMathList;
- // 三角函数值记录在list中
- double step = angleStep * 0.017453292519943295;
- angleMathList = new List<(double cos, double sin)>();
- for (double i = 0; i < 6.2831853; i += step)
- {
- var cos = Math.Cos(i);
- var sin = Math.Sin(i);
- angleMathList.Add((cos, sin));
- }
- return angleMathList;
- }
- }
- static float angleStep = 11.25f;
- static List<(double cos, double sin)> angleMathList;
- public Vector2 Center;
- public float MaxRadius;
- public HashSet<Vector2> Pixels;
- HashSet<(int, int)> grids;
- public PixelArea(Vector2 location)
- {
- Center = location;
- Pixels = new HashSet<Vector2> { location };
- MaxRadius = 0;
- grids = new HashSet<(int, int)>();
- Add(location);
- }
- public PixelArea(IList<PixelArea> areas)
- {
- Center = Vector2.zero;
- Pixels = new HashSet<Vector2>();
- MaxRadius = 0;
- grids = new HashSet<(int, int)>();
- foreach (var a in areas)
- {
- Pixels.AddRange(a.Pixels);
- grids.AddRange(a.grids);
- }
- foreach (var p in Pixels)
- {
- Center += p;
- }
- Center /= Pixels.Count;
- foreach (var p in Pixels)
- {
- var radius = (p - Center).magnitude;
- if (radius > MaxRadius)
- MaxRadius = radius;
- }
- }
- public bool Include((int, int) grid) => grids.Contains(grid);
- public void Add(Vector2 point) => Add(point, GetGrid(point));
- public void Add(Vector2 point, (int x, int y) grid)
- {
- Center += (point - Center) / Pixels.Count;
- var radius = (point - Center).magnitude;
- if (radius > MaxRadius)
- MaxRadius = radius;
- Pixels.Add(point);
- grids.AddRange(new (int, int)[]
- {
- (grid.x + -1, grid.y + 0) , (grid.x + 1 , grid.y + 0),
- (grid.x + 1, grid.y + -1) , (grid.x + -1, grid.y + 1),
- (grid.x + 0, grid.y + -1) , (grid.x + 0 , grid.y + 1),
- (grid.x + -1, grid.y + -1) , (grid.x + 1 , grid.y + 1),
- grid
- });
- }
- public float TotalBrightness(Color[] pixels,Func<int,int,int> Vector2ToIndex, int outer_size = 3)
- {
- (int x, int y) rectMin = ((int)(Center.x - MaxRadius - outer_size), (int)(Center.y - MaxRadius - outer_size));
- (int x, int y) rectMax = ((int)(Center.x + MaxRadius + outer_size), (int)(Center.y + MaxRadius + outer_size));
- var total = 0f;
- Parallel.For(rectMin.x, rectMax.x, (i) =>
- {
- var t = 0;
- for (int j = rectMin.y; j < rectMax.y; j++)
- {
- var index = Vector2ToIndex(i, j);
- var b = pixels[index].Brightness(64);
- t += b;
- }
- lock (InfraredLocate.Locker)
- {
- total += t;
- }
- });
- //total /= (rectMax.y - rectMin.y) * (rectMax.x - rectMin.x);
- return total;
- }
- }
- }
|