Професионална програма
Loading...
KristiqnKonov avatar KristiqnKonov 1 Точки

Точка извън окръжност

Здравейте, трябва ми малко помощ с една задачка. Става въпрос за m(абсциса и ордината) точки и k окръжности (абсциса, ордината и R). Трябва да определя има ли точка, която  не лежи в нито една окръжност. 

for (int j = 0; j < m; j++)
    {
        for (int i = 0; i < k; i++)
        {
            L = sqrt((x[i] - n[j]) * (x[i] - n[j]) + (y[i] - p[j]) * (y[i] - p[j]));
        }
    }
Стигнах до тук където изчислявам дали една точка е в окръжност или не, но не мога да измисля как да стани сравнението дали тази точка не лижи в нието една окръжност. Ще се радвам за малко съдействие :)

Тагове:
0
C++ Programming
j.petrov_90 avatar j.petrov_90 369 Точки
Best Answer

Привет,

На прав път си - малко не ти достига.
Дали една точка се намира в окръжност ще разбереш като провериш дали разстоянието от нея до центъра на окръжността е по-малко от радиуса на окръжността.
Да приемем, че точката се казва X, а центъра на окръжността O.
1) L(xo) < R - точката е в окръжността;
2) L(xo) == R - точката лежи на периферията на окръжността;
3) L(xo) > R - точката е извън окръжността;
Надявам се това ти е достатъчно за да си изведеш последната стъпка сам :)

Бележка:
Евала, че си се сетил, че можеш да умножаваш разстоянията като просто едно умножение вместо да ползваш pow() на 2ра степен.
Замисли се обаче, че по същия този начин можеш изобщо да разкараш убийствено бавното извикване на sqrt().
Просто сравнявай разстоянията на квадрат! Никой не ти иска точните разстояния - просто се пита дали точката е вътре или не.
const float/double R_SQUARED = R * R;
1) (L(xo) * L(xo))  < R_SQUARED - точката е в окръжността;
2) (L(xo) * L(xo)) == R_SQUARED - точката лежи на периферията на окръжността;
3) (L(xo) * L(xo)) > R_SQUARED - точката е извън окръжността;

Забележка:
Веднага да смениш имената на променливите си с нещо, което се разбира, че тези 'x', 'n', 'y', и 'p' са крайно несериозни :)

0
KristiqnKonov avatar KristiqnKonov 1 Точки

Благодаря за бележката ще го имам предвид. Аз пробвах с това което ти си написал в началото, но не мога да направя самата проверка. Пробвах с 
if (L>R[i])
{
точката е извън окръжноста ;
Br++;
}
if (Br>0)
{
има точка която не лежи в нито една окръжност
}
но тази точка може да се окаже вътрешна за друга окръжност и точно това не мога да се сетя как да я изключа.

Относно променливите, винаги черновите ми са разхвърляни :D ще го направя задължително!

0
j.petrov_90 avatar j.petrov_90 369 Точки

Привет отново, Ами ти беше тръгнал правилно в началото.

const int POINTS_COUNT = ...;
const int CIRCLES_COUNT = ...;
//iterate over all points
for (int pointIndex = 0; pointIndex < POINTS_COUNT; ++pointIndex)
{
    bool isPointInsideAnyCircle = false;
    
    //iterate over all the circles for that point
    for (int circleIndex = 0; circleIndex < CIRCLES_COUNT; ++circleIndex)
    {
        //find L with the formula here
        
        if(L >= R)
        {
            isPointInsideAnyCircle = true;
            
            //break the inner loop - no need to go on
            break;
        }
    }
    
    if(!isPointInsideAnyCircle)
    {
        //the point is not inside some circle
        //do what ever you like with it
        std::cout << "point.x: "   << pointsX[pointIndex]
                  << ", point.y: " << pointsY[pointIndex]
                  << "is outside all the circles" << std::endl;
    }
}

0
06/12/2018 09:38:44
KristiqnKonov avatar KristiqnKonov 1 Точки

Благодаря много! Бях пробвал подобен вариант, но не си правих проверката правилно и от там ми излизаше грешен отговор :)

Благодаря още веднъж за отделеното време.

0