Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Как вычислить номера клеток пересечения прямых


Автор: AnnBlack 16.11.2017, 11:24
Есть  прямая,которая задается координатами начала x1 y1 и координатами конца x2 y2.Прямая проходит через сетку ,разбитую на клетки. Есть программа, которая вычисляет координаты точек пересечения задаваемой прямой с массивом горизонтальных линий сетки, а потом вычисляет координаты точек пересечения задаваемой прямой с массивом вертикальных линий сетки;дальше эти два массива объединяются в один, происходит сортировка по возрастанию по x и затем наконец вычисляются длины пересечений прямой  с сеткой( с квадратиками);
Но надо определить позиции клеток пересечения ... Может кто в курсе как это посчитать?
Код

#include "stdafx.h"
#include <iostream> 
#include <conio.h>
#include <math.h>
 
using namespace std;
 
void sort(pair<double, double> coords[24])
{
    int n=24;
    pair <double, double> tmp;
 
    for (int i = 0; i < n - 1; ++i)
    {
        for (int j = 0; j < n - 1; ++j) 
        {
            if (coords[j + 1].first < coords[j].first)
            {
                tmp = coords[j + 1];
                coords[j + 1] = coords[j];
                coords[j] = tmp;
                
            }
        }
    }
}

int main()
 
{
    int i;//номер верт. линии 
    int j;//номер линии
    double Ny;//шаг сетки
    double y, x, x1, x2, y1, y2,d;
        
    cout << "Vvedite x1";
    cin >> x1;
    cout << "Vvedite x2";
    cin >> x2;
 
    cout << "Vvedite y1";
    cin >> y1;
    cout << "Vvedite y2";
    cin >> y2;
    cout << "shag setki";
    cin >> Ny;
 
 
    pair<double, double> coords[24];
    for (j = 1; j <= 12; j++) {               //пересечения с горизонт линиями сетки
        y = Ny*j;
        x = (x2*(y - y1) - x1*(y - y2)) / (y2 - y1);
        coords[j - 1].first = x;
        coords[j - 1].second = y;
        cout << x <<" "<<y <<endl;

    }
    for (i = 1; i <= 12;i++) {         //пересечения с вертик линиями сетки
        x = Ny*i;
        y = (y2*(x - x1) - y1*(x - x2)) / (x2 - x1);
        coords[11 + i].first = x;
        coords[11 + i].second = y;
        cout << x <<" "<<y <<endl;
    }
    sort(coords);                     //сортировка по возрастанию и вывод координат
    for (j = 0; j < 24; j++)  
        cout << coords[j].first <<" "<< coords[j].second << endl;
    for(j=0;j<24;j=j+2)           //вывод длин пересечений
    cout << sqrt((coords[j+1].first-coords[j].first)*(coords[j+1].first-coords[j].first)+(coords[j+1].second- coords[j].second)*(coords[j+1].second-coords[j].second))<< endl;   //вывод длин пересечений


    
    system("pause");
 
    return 0;
 

}


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