Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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); // вертикальна лінія
            }
        }
Beispiel #3
0
 /// <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);
 }