Прошу помощи. Помогите разобраться с несколькими заданиями, и разъяснить некоторые детали.
Задача 1: Выяснить взаимное расположение окружностей. Заданы их координаты и радиусы.
Код:
#include <conio.h>
#include <stdio.h>
#include <math.h>
#define EPS 1e-7
int main()
{
float x01, x02, y01, y02;
float r1, r2, dl;
char ag;
printf("\nThis program will determine the relative positions of the circles.");
do
{
// Input ON
printf("\nPlease input x-coord of the first circle: ");
scanf("%f", &x01);
printf("Please input y-coord of the first circle: ");
scanf("%f", &y01);
do
{
printf("Please input radius of the first circle: ");
scanf("%f", &r1);
} while (r1<=0);
printf("Please input x-coord of the second circle: ");
scanf("%f", &x02);
printf("Please input y-coord of the second circle: ");
scanf("%f", &y02);
do
{
printf("Please input radius of the second circle: ");
scanf("%f", &r2);
} while (r2<=0);
// Input OFF
// dl=sqrt(((x01-x02)*(x01-x02))+((y01-y02)*(y01-y02)));
dl=hypot(x01-x02,y01-y02);
if (dl==0) {
if (r1>r2) printf("Second circle is embedded in the first.");
if (r2>r1) printf("First circle is embedded in the second.");
if (r1==r2) printf("Circles coincide with each other.");
} else
if (dl>(r1+r2)) printf("The circles do not interact."); else
if (dl==(r1+r2)) printf("The circles have one common point. External touch."); else
if ((dl<fabs(r1-r2)) /*&&(dl!=0)*/ &&(r1>r2)) printf("The second circle inside the first."); else
if ((dl<fabs(r1-r2)) /*&&(dl!=0)*/ &&(r2>r1)) printf("The fisrt circle inside the second."); else
if (fabs(dl-(r1+r2))<EPS) printf("The circles have one common point. Internal touch. The second circle inside the first."); else
if (fabs(dl-(r1+r2))<EPS) printf("The circles have one common point. Internal touch. The second circle inside the first."); else
if (((r1-r2)<dl)&&(dl<(r1+r2))) printf("The circles intersect.");
printf("\nAgain? ('n' - no, anykey - yes).");
ag=getch();
} while (ag!='n');
printf("\nThanks for using.\n");
return 0;
}
У меня получился такой вот код. А теперь, если можно, попридирайтесь ко всему, что заметите.
Задача 2: Даны координаты двух векторов, исходящих из одной точки. Необходимо сосчитать градусную меру угла, составленного из этих векторов, при условии, что считать будем именно от вектора 1 до вектора 2. То есть, против часовой стрелки, с конкретно определенными векторами (может получиться угол > 180 и пр.).
Задачу эту наверняка можно решить, определя перпендикуляр, вычислить проэкцию одного из векторов, если проэкция будет положительна, значит второй вектор находится в той же полуплоскости что и первый. Если отрицательна, значит при вычислении угла нужно вычесть все это из 180 градусов.
Я попробовал предложить такую идею. То есть, нужно как-то програмно поворачивать первый вектор (или ось, которая будет совпадать с первым вектором), допустим, на один градус, в цикле, до тех пор пока он не совпадет со вторым вектором. Из количества итераций можно будет найти градусную меру. Можно ли реализовать данную идею? Возможно придется поворачивать вектор не на один градус, а на полградуса (нужно как-то осторожно определить шаг, чтобы ось не перескочила через вектор и не зациклилась). И вообще, как крутануть на один градус именно против часовой стрелки? Можно ли это сделать и насколько это оправдано?