/// <summary> /// Розрахунок значення масиву точок лінії амплітуд сигналів /// </summary> /// <param name="line">координати лінії</param> /// <param name="bitmap">картинка яка аналізується</param> /// <returns></returns> internal unsafe float[,] GetPixelFromLine(PointSort line, Bitmap bitmap) { // кількість елементів в списку int num = line.PointN; // розміри зображення int w = bitmap.Width, h = bitmap.Height; // амплітуди сигналів float[,] amp = new float[2, num]; // знаходимо відстані які займає по двум осям лінія float dLX = line.SecondL.X - line.FirstL.X, dLY = line.SecondL.Y - line.FirstL.Y; // знаходимо кроки дискретизації лінії float dX = dLX / (num - 1), dY = dLY / (num - 1); // тимчасова координата Point tempPoint = line.FirstL; BitmapData BD = bitmap.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); try { byte *curpos; fixed(float *_amp = amp) { float *_num = _amp, _val = _amp + num; for (int i = 0; i < num; i++) { // задаємо точку в якій визначатимемо амплітуду сигналу tempPoint = new Point( line.FirstL.X + (int)Math.Round(i * dX, MidpointRounding.AwayFromZero), line.FirstL.Y + (int)Math.Round(i * dY, MidpointRounding.AwayFromZero)); curpos = ((byte *)BD.Scan0) + tempPoint.Y * BD.Stride + tempPoint.X * 4; *_num = i; _num++; *_val = *curpos / 255f; _val++; } } } finally { bitmap.UnlockBits(BD); } return(amp); }
/// <summary> /// Розрахунок нахилу лінії в градусах /// </summary> /// <param name="points">Точки лінії</param> /// <returns></returns> private float AngleLine(PointSort points) { float dX = points.FirstP.X - points.SecondP.X, dY = points.FirstP.Y - points.SecondP.Y; if (dX != 0) { return(-(float)(Math.Atan(dY / dX) * 180.0 / Math.PI)); // похила і горизонтальна лінії } else { return(90f); // вертикальна лінія } }
/// <summary> /// З'єднуємо два маркери лінією /// </summary> /// <param name="ps">Координати двох ліній</param> /// <param name="g">Графічна область елемента на якому малюємо</param> internal void DrawLine(PointSort ps, Graphics g) { // малюємо лінію g.DrawLine(Col_Think, ps.FirstP, ps.SecondP); }