Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [С#->Visual C++] Точки, принадлежащие прямой 
V
    Опции темы
Ambition
Дата 23.10.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



Народ, помогите кто переписать код программульки на СИ++ из С#. Я очень слабовато знаю С#, и мне тяжеловато было переписать - вообще ничего не получилось. Заранее спасибо, кто отзовётся. Код во вложенном файлике.
PM MAIL   Вверх
Ambition
Дата 23.10.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



 
Цитата

Вот кодик. А то по-другому глючит...  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();
                    }
                }
            }
        }
    }



Это сообщение отредактировал(а) alexeis1 - 23.10.2006, 16:34
PM MAIL   Вверх
ivashkanet
Дата 23.10.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 9
Всего: 149



Ambition, это мой код из соседней темы?  smile 

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

Добавлено @ 15:08 
Вот оригинал
PM MAIL WWW ICQ   Вверх
Damarus
Дата 23.10.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 7
Всего: 29



Цитата(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();
}


Это сообщение отредактировал(а) Damarus - 23.10.2006, 15:55
PM MAIL ICQ Jabber   Вверх
Ambition
Дата 23.10.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



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

Добавлено @ 16:10 
Тема отмечена, как закрытая.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0459 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.