Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [С#->Visual C++] Точки, принадлежащие прямой


Автор: Ambition 23.10.2006, 14:18
Народ, помогите кто переписать код программульки на СИ++ из С#. Я очень слабовато знаю С#, и мне тяжеловато было переписать - вообще ничего не получилось. Заранее спасибо, кто отзовётся. Код во вложенном файлике.

Автор: Ambition 23.10.2006, 14:39
 
Цитата

Вот кодик. А то по-другому глючит...  smile 

Код

class Program
    {
        struct Dot
        {
            public float X;
            public float Y;
            public Dot(float x, float y)
            {
                this.X = x;
                this.Y = y;
            }
        }

        static void Main(string[] args)
        {
            Dot[] dots = new Dot[10];
            dots[0] = new Dot(0, 0);
            dots[1] = new Dot(1, 2);
            dots[2] = new Dot(3, 4);
            dots[3] = new Dot(2, 4);
            dots[4] = new Dot(15, 20);
            dots[5] = new Dot(4, 36);
            dots[6] = new Dot(4, 11);
            dots[7] = new Dot(22, 19);
            dots[8] = new Dot(16, 32);
            dots[9] = new Dot(-56, -356);

            findDotsOnLine(dots);

            System.Console.ReadKey();
        }

        private static void findDotsOnLine(Dot[] dots)
        {
            Dot impossibleDot = new Dot(float.MinValue, float.MaxValue);

            int dotsCount = dots.Length;

            for (int i = 0; i < dotsCount; i++)
            {
                if (dots[i].X == impossibleDot.X && dots[i].Y == impossibleDot.Y) continue;

                Dot startLineDot = dots[i];

                for (int j = i + 1; j < dotsCount; j++)
                {
                    if (dots[j].X == impossibleDot.X && dots[j].Y == impossibleDot.Y) continue;

                    // У прямой есть направляющий вектор (a, b) если по точкам, то 
                    // Если у двух прямых направляющие векторы совпадают (по направлению)
                    // то прямые паралельны, но в нашем случае они выходят из одной 
                    // точки (startLineDot) и поэтому обязаны совпасть,
                    // а значит третья точка лежит на одной прямой с первыми двумя
                    // так как нам важно только направление, то будем проверять условие
                    // a1 * b2 - b1 *a2 = 0

                    // Тута будем складывать точки лежащие на одной прямой с 
                    // i-ой и j-ой точками
                    Dot[] foundedDots = new Dot[dotsCount];
                    int foundedDotsCounter = 0;

                    float a1 = dots[j].X - startLineDot.X;
                    float b1 = dots[j].Y - startLineDot.Y;

                    for (int k = j + 1; k < dotsCount; k++)
                    {
                        if (dots[k].X == impossibleDot.X && dots[k].Y == impossibleDot.Y) continue;

                        float a2 = dots[k].X - startLineDot.X;
                        float b2 = dots[k].Y - startLineDot.Y;

                        if (a1 * b2 - b1 * a2 == 0)
                        {
                            // точка наша, добавляем ее в массив найденных
                            foundedDots[foundedDotsCounter] = dots[k];
                            foundedDotsCounter += 1;
                            // помечаем ее
                            dots[k] = impossibleDot;
                        }
                    }

                    // Если мы нашли хоть одну "третью" точку --- показываем массив точек
                    if (foundedDotsCounter > 0)
                    {
                        System.Console.Write("({0}, {1}), ", dots[i].X, dots[i].Y);
                        System.Console.Write("({0}, {1}), ", dots[j].X, dots[j].Y);

                        for (int l = 0; l < foundedDotsCounter; l++)
                        {
                            System.Console.Write("({0}, {1}), ", foundedDots[l].X, foundedDots[l].Y);
                        }
                        System.Console.WriteLine();
                    }
                }
            }
        }
    }


Автор: ivashkanet 23.10.2006, 15:01
Ambition, это мой код из соседней темы?  smile 

А что не так? что не можешь перевести?

Добавлено @ 15:08 
http://forum.vingrad.ru/index.php?showtopic=116129&view=findpost&p=886473 оригинал

Автор: Damarus 23.10.2006, 15:54
Цитата(Ambition @  23.10.2006,  15:18 Найти цитируемый пост)
Народ, помогите кто переписать код программульки на СИ++ из С#.

Код
#include <iostream>
#include <vector>

struct Dot
{
    float X;
    float Y;
    Dot(float x, float y) : X(x), Y(y) { }
    Dot(void) : X(0), Y(0) { }
};

void findDotsOnLine(std::vector<Dot>& dots)
{
    Dot impossibleDot(3.4E-38f, 3.4E+38f);

    std::vector<Dot>::size_type dotsCount = dots.size();
    for (std::vector<Dot>::size_type i = 0; i < dotsCount; i++)
    {
        if (dots[i].X == impossibleDot.X && dots[i].Y == impossibleDot.Y) 
            continue;

        Dot startLineDot = dots[i];

        for (std::vector<Dot>::size_type j = i + 1; j < dotsCount; j++)
        {
            if (dots[j].X == impossibleDot.X && dots[j].Y == impossibleDot.Y)
                continue;

            // У прямой есть направляющий вектор (a, b) если по точкам, то 
            // Если у двух прямых направляющие векторы совпадают (по направлению)
            // то прямые паралельны, но в нашем случае они выходят из одной 
            // точки (startLineDot) и поэтому обязаны совпасть,
            // а значит третья точка лежит на одной прямой с первыми двумя
            // так как нам важно только направление, то будем проверять условие
            // a1 * b2 - b1 *a2 = 0

            // Тута будем складывать точки лежащие на одной прямой с 
            // i-ой и j-ой точками
            std::vector<Dot> foundedDots(dotsCount);
            int foundedDotsCounter = 0;

            float a1 = dots[j].X - startLineDot.X;
            float b1 = dots[j].Y - startLineDot.Y;

            for (std::vector<Dot>::size_type k = j + 1; k < dotsCount; k++)
            {
                if (dots[k].X == impossibleDot.X && dots[k].Y == impossibleDot.Y) 
                    continue;

                float a2 = dots[k].X - startLineDot.X;
                float b2 = dots[k].Y - startLineDot.Y;

                if (a1 * b2 - b1 * a2 == 0)
                {
                    // точка наша, добавляем ее в массив найденных
                    foundedDots[foundedDotsCounter] = dots[k];
                    foundedDotsCounter += 1;

                    // помечаем ее
                    dots[k] = impossibleDot;
                }
            }

            // Если мы нашли хоть одну "третью" точку --- 
            // показываем массив точек
            if (foundedDotsCounter > 0)
            {
                std::cout << "(" << dots[i].X << ", " << dots[i].Y << "), ";
                std::cout << "(" << dots[j].X << ", " << dots[j].Y << "), ";

                 for (int l = 0; l < foundedDotsCounter; l++)
                     std::cout << "(" << foundedDots[l].X << ", " << foundedDots[l].Y << "), ";

                 std::cout << std::endl;
            }
        }
    }
}

int main(int argc, char *argv[], char *envp[])
{
    std::vector<Dot> dots(10);
    
    dots[0] = Dot(0, 0);
    dots[1] = Dot(1, 2);
    dots[2] = Dot(3, 4);
    dots[3] = Dot(2, 4);
    dots[4] = Dot(15, 20);
    dots[5] = Dot(4, 36);
    dots[6] = Dot(4, 11);
    dots[7] = Dot(22, 19);
    dots[8] = Dot(16, 32);
    dots[9] = Dot(-56, -356);

    findDotsOnLine(dots);

    std::cin.get();
}

Автор: Ambition 23.10.2006, 16:04
ivashkanet, да это твой код  smile Ты мне ответил на письмецо с просьбой, вот только переписать  не получилось его, с языка С# (так как я плохо пока в нём рахзбираюсь  smile )
Damarus, пасиб тебе.

Добавлено @ 16:10 
Тема отмечена, как закрытая.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)