Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для Alexdemath
128 / 125 / 39
Регистрация: 11.04.2010
Сообщений: 255

Упростить коэффициенты уравнения прямой Ax+By+C=0

30.12.2012, 00:10. Показов 2158. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите доделать скрипт символьных преобразований, остался один пункт, над которым мучаюсь.

Нужно упростить коэффициенты уравнения прямой Ax+By+C=0, где A,B,C - переменные (A,B,C и A,B не равны 0 одновременно). На выходе должно получиться тоже уравнение A1x+B1y+C1=0, но c упрощёнными коэффициентами.
Например,
1) если A<0, то на выходе A1>0;
2) если A=1 (или -1), то на выходе x+B1y+C1=0, аналогично для B;
3) если A=0, то на выходе B1y+C1=0, аналогично для B;
4) если С=0, то на выходе A1x+B1y=0;
и т.п.

Это и тривиальные случаи (A=B=C=/=0; A=0, B=C; A=/=0, B=C=0 и т.п.) сокращения НОД получилось .
Не могу в общем случаи сократить на наибольший общий делитель.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<script>
function simplifyLineEq()
{ var A = document.getElementById('x1').value*1,
      B = document.getElementById('y1').value*1,
      C = document.getElementById('z1').value*1,
      A1 = document.getElementById('tx1'),
      B1 = document.getElementById('ty1'),
      C1 = document.getElementById('tz1');
 
  if (B<0)  { if (B!==-1){var mpB = '+'+Math.abs(B), pmB = B}
              if (B===-1){var mpB = '+', pmB = '-'}
            } 
  if (B>0) { if(B!==1){var mpB = '-'+B, pmB = '+'+B}
             if(B===1){var mpB = '-',   pmB = '+'}
           }
  if (C<0)  {var pmC = C,     mpC = '+'+Math.abs(C)}
  if (C>0)  {var pmC = '+'+C, mpC = '-'+C}
  if (C===0){var pmC = '',    mpC = ''}
 
 
  if (A<0 && A!==-1) {A1.value = Math.abs(A)+'x'; B1.value = mpB+'y'; C1.value = mpC+'=0'}
  if (A===-1)        {A1.value = 'x';             B1.value = mpB+'y'; C1.value = mpC+'=0'}
 
  if (A>0 && A!==1) {A1.value = A+'x'; B1.value = pmB+'y'; C1.value = pmC+'=0'}
  if (A===1)        {A1.value = 'x';   B1.value = pmB+'y'; C1.value = pmC+'=0'}
 
  if (A===0)
     { A1.value = '';
       if (C!==0)
          { if (B<0 && B!==-1) {B1.value = Math.abs(B)+'y'; C1.value = mpC+'=0'} 
            if (B===-1)        {B1.value = 'y';             C1.value = mpC+'=0'}
            if (B>0 && B!==1)  {B1.value = B+'y';           C1.value = pmC+'=0'} 
            if (B===1)         {B1.value = 'y';             C1.value = mpC+'=0'}
          }
       if (C===0)  {B1.value = 'y'; C1.value = '=0'}
       if (B===C)  {B1.value = 'y'; C1.value = '+1=0'}
       if (B===-C) {B1.value = 'y'; C1.value = '-1=0'}
     }
  
  if (B===0)
     { B1.value = '';
       if (C!==0)
          { if (A<0 && A!==-1) {A1.value = Math.abs(A)+'x'; C1.value = mpC+'=0'} 
            if (A===-1)        {A1.value = 'x';             C1.value = mpC+'=0'}
            if (A>0 && A!==1)  {A1.value = A+'x';           C1.value = pmC+'=0'} 
            if (A===1)         {A1.value = 'x';             C1.value = mpC+'=0'}
          }
       if (C===0)  {A1.value = 'x'; C1.value = '=0'}
       if (A===C)  {A1.value = 'x'; C1.value = '+1=0'}
       if (A===-C) {A1.value = 'x'; C1.value = '-1=0'}
     }
 
  if (C===0) { if (A===B)  {A1.value = 'x'; B1.value = '+y'; C1.value = '=0'}
               if (A===-B) {A1.value = 'x'; B1.value = '-y'; C1.value = '=0'} }
 
  if (A===B && A===C && B===C)   {A1.value = 'x'; B1.value = '+y'; C1.value = '+1=0'}
  if (A===-B && A===-C && B===C) {A1.value = 'x'; B1.value = '-y'; C1.value = '-1=0'}
  if (A===-B && A===C && B===-C) {A1.value = 'x'; B1.value = '-y'; C1.value = '+1=0'}
  if (A===B && A===-C && B===-C) {A1.value = 'x'; B1.value = '+y'; C1.value = '-1=0'}
}
</script>
<div>Ax + By + C = 0 (примечание: на входе числа, на выходе уравнение)</div>
A = <input type="text" id="x1"><br>
B = <input type="text" id="y1"><br>
C = <input type="text" id="z1"><br>
<button onclick="simplifyLineEq()">Упростить</button><br>
A1 = <input type="text" id="tx1"><br>
B1 = <input type="text" id="ty1"><br>
C1 = <input type="text" id="tz1">
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.12.2012, 00:10
Ответы с готовыми решениями:

Коэффициенты уравнения прямой
Определить коэффициенты уравнения прямой, параллельной данной прямой, определяемой уравнением Ax+By+C=0, и проходящей через точку с...

Переписать коэффициенты прямых, параллельных первой прямой (коэффициенты заданы в типизированном файле)
Прямая на плоскости задается уравнением Ax+by+c=0, где A и В одновременно не равняются нулю. пусть F файл, который содержит коэффициент...

Переписать в файл Н коэффициенты прямых, которые: а) параллельны первой прямой б) пересекаются с последней прямой
Прямая на плоскости задается уравнением Ах+Ву+С=0, где А и В одновременно не равны 0. Пусть коэффициенты А, В, С – целые числа, которые...

10
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
30.12.2012, 06:31
вы не осветили один вопрос: A, B и C на входе и A1, B1 и C1 на выходе у вас всегда целые числа?
0
 Аватар для Alexdemath
128 / 125 / 39
Регистрация: 11.04.2010
Сообщений: 255
30.12.2012, 13:02  [ТС]
Цитата Сообщение от kalabuni Посмотреть сообщение
вы не осветили один вопрос: A, B и C на входе и A1, B1 и C1 на выходе у вас всегда целые числа?
Если на входе A, B и C - все целые, то на выходе A1, B1 и C1 - тоже все целые, в противном случае A1=A, B1=B и C1=C.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
30.12.2012, 13:11
Цитата Сообщение от Alexdemath Посмотреть сообщение
Если на входе A, B и C - все целые, то на выходе A1, B1 и C1 - тоже все целые, в противном случае A1=A, B1=B и C1=C.
что-то вы не то написали

я пытаюсь выяснить - что именно вам надо, а вы делаете какой-то вывод
извините, но если на входе даже целые, например: 2x + 7y + 5 = 0
то на выходе может быть и x + 3.5y + 2.5 = 0 - а это совсем даже не целые числа

так вот ещё раз спрашиваю:
1) какие коэффициенты будут на входе - всегда целые?
ответ требуется в виде да/нет

2) какие коэффициенты должны получиться на выходе - всегда целые?
и здесь ответ требуется в виде да/нет
0
 Аватар для Alexdemath
128 / 125 / 39
Регистрация: 11.04.2010
Сообщений: 255
30.12.2012, 13:23  [ТС]
Простите, Вы правы.

Цитата Сообщение от kalabuni Посмотреть сообщение
1) какие коэффициенты будут на входе - всегда целые?
нет.

Цитата Сообщение от kalabuni Посмотреть сообщение
2) какие коэффициенты должны получиться на выходе - всегда целые?
нет.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
30.12.2012, 13:46
тогда не очень понятно, что вам нужно

о каком НОД'e может идти речь в случае нецелых чисел?
НОД под определению - он для целых чисел, см. wiki/Наибольший_общий_делитель
0
 Аватар для Alexdemath
128 / 125 / 39
Регистрация: 11.04.2010
Сообщений: 255
30.12.2012, 13:58  [ТС]
Простите за корявое объяснение.

Если на входе хотя бы один из коэффициентов A,B,C не целый, то ничего не упрощаем (A1=A,B1=B,C1=C).
Если же A,B,C все целые, то упрощаем.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
30.12.2012, 14:08
Цитата Сообщение от Alexdemath Посмотреть сообщение
Если же A,B,C все целые, то упрощаем.
т.е. целые на входе - это частный случай

ну и последний вопрос: если на входе целые, то упрощать надо так, чтобы на выходе тоже были целые?
0
 Аватар для Alexdemath
128 / 125 / 39
Регистрация: 11.04.2010
Сообщений: 255
30.12.2012, 14:11  [ТС]
Цитата Сообщение от kalabuni Посмотреть сообщение
т.е. целые на входе - это частный случай
да.

Цитата Сообщение от kalabuni Посмотреть сообщение
ну и последний вопрос: если на входе целые, то упрощать надо так, чтобы на выходе тоже были целые?
да.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
30.12.2012, 15:11
для нахождения НОД проще всего использовать алгоритм Евклида

т.е. сначала проверяете целочисленность введённых значений по схеме
if (parseInt (A) == A) целое; else нецелое;
в случае, если все три коэффициента целые, находите НОД по алгоритму Евклида
__________________

если самому не получится - дайте знать, помогу
1
 Аватар для Alexdemath
128 / 125 / 39
Регистрация: 11.04.2010
Сообщений: 255
02.01.2013, 19:20  [ТС]
Вроде бы, получилось.

P.S. Ещё бы понять алгоритм для упрощения коэффициентов уравнения n-го порядка (в пределах разумного).

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<div>A<sub>0</sub>x + B<sub>0</sub>y + C<sub>0</sub> = 0</div>
A<sub>0</sub> = <input style="width:50px;" id="x0">; 
B<sub>0</sub> = <input style="width:50px;" id="y0">; 
C<sub>0</sub> = <input style="width:50px;" id="z0"> Введите любые значения кроме A и B одновременно равных 0<br>
<button onclick="normaLineEq()">Упростить</button><br>
<input style="text-align: center;" id="L1"><input style="text-align: center;" id="L2"><br><br>
 
<script>
function NOD(x,y){ while ((x!=0) && (y!=0)) {if (x>y) {x%=y} else {y%=x}} return (x+y) }
 
function simplifyLineEq(A0,B0,C0)
{ 
  var nod = NOD(NOD(Math.abs(A0),Math.abs(B0)),Math.abs(C0));
 
  if (A0%1==0 && B0%1==0 && C0%1==0) {var A=A0/nod, B= B0/nod, C=C0/nod}
  else {var A=A0, B=B0, C=C0}
 
  if (B<0)
     { if (B!==-1){var mpB = '+'+Math.abs(B), pmB = B}
       if (B===-1){var mpB = '+', pmB = '-'}
     } 
  if (B>0)
     { if(B!==1){var mpB = '-'+B, pmB = '+'+B}
       if(B===1){var mpB = '-',   pmB = '+'}
     }
 
  if (C<0)  {var pmC = C,     mpC = '+'+Math.abs(C)}
  if (C>0)  {var pmC = '+'+C, mpC = '-'+C}
  if (C===0){var pmC = '',    mpC = ''}
 
  if (A<0 && A!==-1) {var A1 = Math.abs(A)+'x', B1 = mpB+'y', C1 = mpC+'=0'}
  if (A===-1)        {var A1 = 'x',             B1 = mpB+'y', C1 = mpC+'=0'}
 
  if (A>0 && A!==1) {var A1 = A+'x', B1 = pmB+'y', C1 = pmC+'=0'}
  if (A===1)        {var A1 = 'x',   B1 = pmB+'y', C1 = pmC+'=0'}
 
  if (A===0)
     { var A1 = '';
       if (C!==0)
          { if (B<0 && B!==-1) {var B1 = Math.abs(B)+'y', C1 = mpC+'=0'} 
            if (B===-1)        {var B1 = 'y',             C1 = mpC+'=0'}
            if (B>0 && B!==1)  {var B1 = B+'y',           C1 = pmC+'=0'} 
            if (B===1)         {var B1 = 'y',             C1 = mpC+'=0'}
          }
       if (C===0)  {var B1 = 'y', C1 = '=0'}
       if (B===C)  {var B1 = 'y', C1 = '+1=0'}
       if (B===-C) {var B1 = 'y', C1 = '-1=0'}
     }
  
  if (B===0)
     { var B1 = '';
       if (C!==0)
          { if (A<0 && A!==-1) {var A1 = Math.abs(A)+'x', C1 = mpC+'=0'} 
            if (A===-1)        {var A1 = 'x',             C1 = mpC+'=0'}
            if (A>0 && A!==1)  {var A1 = A+'x',           C1 = pmC+'=0'} 
            if (A===1)         {var A1 = 'x',             C1 = mpC+'=0'}
          }
       if (C===0)  {var A1 = 'x', C1 = '=0'}
       if (A===C)  {var A1 = 'x', C1 = '+1=0'}
       if (A===-C) {var A1 = 'x', C1 = '-1=0'}
     }
 
  if (C===0)
      { if (A===B)  {var A1 = 'x', B1 = '+y', C1 = '=0'}
        if (A===-B) {var A1 = 'x', B1 = '-y', C1 = '=0'}
      }
 
  if (A===B && A===C && B===C)   {var A1 = 'x', B1 = '+y', C1 = '+1=0'}
  if (A===-B && A===-C && B===C) {var A1 = 'x', B1 = '-y', C1 = '-1=0'}
  if (A===-B && A===C && B===-C) {var A1 = 'x', B1 = '-y', C1 = '+1=0'}
  if (A===B && A===-C && B===-C) {var A1 = 'x', B1 = '+y', C1 = '-1=0'}
 
  return A1+B1+C1;
}
 
function normaLineEq()
{ var a = document.getElementById('x0').value*1,
      b = document.getElementById('y0').value*1,
      c = document.getElementById('z0').value*1;
document.getElementById('L1').value = '('+a+')x+('+b+')y+('+c+')=0';
document.getElementById('L2').value = simplifyLineEq(a,b,c);
}
</script>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.01.2013, 19:20
Помогаю со студенческими работами здесь

Составить канонические уравнения прямой,проходящей через точку параллельно прямой
Составить канонические уравнения прямой, проходящей через точку (0;-1;-3) параллельно прямой х+1 = ( у + 2 ) / 2 = - z - 1 ...

Составить каноническое и параметрическое уравнения для прямой, которая идет через точку (3,3) перпендикулярно прямой 2x-3y+1=0
Составить каноническое и параметрическое уравнения для прямой, которая идет через точку (3,3) перпендикулярно прямой 2x-3y+1=0

Составить уравнения: прямой А3 N параллельной прямой А1 А4
Даны четыре точкиА1(4,6,5), А2(6,9,4), А3(2,10,10), А4(7,5,9). Составить уравнения: прямой А3 N параллельной прямой А1 А4 Правило...

Переписать из исходной таблицы в другую коэффициенты прямых, параллельных первой прямой
Дана задача: Прямая на плоскости задается уравнением ax+by+c=0, где a и b одновременно не равны нулю. Будем рассматривать только прямые,...

OpenGL. Передать в процедуру рисования Draw коэффициенты прямой, вычисляемые в другой процедуре
Пишу программу, используя OPENGL.Проблема следующая, как мне передать в процедуру рисования Draw коэффициенты прямой,вычисляемые в другой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru