LINUX.ORG.RU

Есть ли такая рисующая графики софта

 , ,


0

2

Провожу из ординаты параллельную оси абсцисс линию которая пересекает какую-то кривую и точка, по абсциссе, пересечения кривой с прямой выдается автоматом. В gnuplot такого не нашел, а может просто нет такого.

Либо это программа для оцифровки графиков (Webplotdigitizer), либо любая софиига решающая уравнение для твоей кривой: уравнение кривой известно, значение функции в точке x тоже, остаётся найти x.

Во втором случае octave, scilab или, скорее даже, maxima.

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)
Ответ на: комментарий от grem

gnuplot вроде как может сохранять в dxf, только я завести это не могу. У меня уравнение кривой около метра. По одному параметру получаю пять точек, точки скармливаю gnuplot. dxf формат был бы супер.

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 1)
Ответ на: комментарий от saufesma

Так функция неизвестна? Есть большой набор точек? Тогда просто возьми две ближайшие к заданной ординате и интерполируй хотя бы линейно, чтобы найти x для заданной ординаты.

grem ★★★★★
()

Дурка, не знаю зачем, но я на это несколько часов убил. Помню когда-то мне @Bad_ptr помогал вхождение точки в отрезок вычислять. Это навреное совсем не то что тебе надо, но кажется выглядит так как ты хочешь :D Может пригодится, хз :D

apt install love
mkdir plot 
cd plot 
touch main.lua
копипаста кода
love .

local axis = {x = 10, y=10}
local model   = {};
local models  = 1;
model[models] = {};

function point_intersect_line(line_start,line_end,point,radius)

    local v1 = {x=0,y=0};
    local v2 = {x=0,y=0};
    local v3 = {x=0,y=0};
    local v4 = {x=0,y=0};
    local normalized = {x=0,y=0};

    v1.x = line_end.x - line_start.x;
    v1.y = line_end.y - line_start.y;

    v2.x = point.x - line_start.x;
    v2.y = point.y - line_start.y;

    local len = math.sqrt(v1.x * v1.x + v1.y * v1.y);
    normalized.x = v1.x / len;
    normalized.y = v1.y / len;

    len = math.sqrt(v2.x * v2.x + v2.y * v2.y);
    v3.x = normalized.x * len;
    v3.y = normalized.y * len;

    if (v3.x * v1.x) + (v3.y * v1.y) < 0 then
        return false;
    end

    if (v3.x * v3.x + v3.y * v3.y) > (v1.x * v1.x + v1.y * v1.y) then
        return false;
    end

    v4.x = v2.x - v3.x;
    v4.y = v2.y - v3.y;
    len = (v4.x * v4.x + v4.y * v4.y)
    if len < radius   then
        return true;
    end

    return false;

end

local is_collided = {};

function collide(lines,point)
    local wsize_y = love.graphics.getHeight()
    local radius = 1;
    for i=1,#lines,2 do
       if( not lines[i+2]) then
            return;
       end
       local s = { x=lines[i+0] or 0, y=lines[i+1] or 0};
       local e = { x=lines[i+2] or 0, y=lines[i+3] or 0};
       if point_intersect_line(s,e,point,radius) then

          if is_collided[tostring(s.x)] == 1 then
             break;
          else
            is_collided[tostring(s.x)] = 1
          end

          love.graphics.setColor(1,0,0,1)
          love.graphics.points(point.x,point.y);
          love.graphics.setColor(1,0,1,1)
          love.graphics.line(point.x,point.y,point.x,wsize_y-axis.y);
          love.graphics.setColor(1,1,1,1)
          love.graphics.print("x="..point.x .. "\ny="..wsize_y-point.y,point.x-50,point.y+10)
          love.graphics.setColor(s.x/500,s.y/500,0.5,1)
          love.graphics.setLineWidth(2)
          love.graphics.line(s.x,s.y,e.x,e.y);
          love.graphics.setLineWidth(1)
          love.graphics.setColor(1,1,0,1)
          love.graphics.rectangle('line', point.x-10, point.y-10, 20, 20)
       end
    end
end


function love.mousepressed(x,y)
    local mx = model[models];
    mx[#mx+1]=x;
    mx[#mx+1]=y;
end

function love.keypressed(key)
    if key == 'space' then
       models=models+1;
       model[models]={};
    end

    if key == 'r' then
       models=1;
       model={};
       model[models] = {};
    end
end

function love.load()
    love.graphics.setBackgroundColor( 0x2d/255,0x38/255,0x53/255,1)
    love.window.setMode(1280,720);
end

function love.draw()

    love.graphics.print("[Create point for curve - Mouse click]\n [Create new curve - SPACE]\n [Delete all curves - R]",1000,20);

    local wsize_y = love.graphics.getHeight()
    local step_y  = wsize_y / 100;

    local wsize_x = love.graphics.getWidth()
    local step_x  = wsize_x / 200;

    local count   = 0;
    local points = {};

    love.graphics.setPointSize(2)
    love.graphics.setColor(0x83/255,0xc0/255,0xf0/255 ,1)

    for i=wsize_y-axis.y,axis.y,-step_y do
        love.graphics.points(axis.x,i);
    end

    for i=wsize_x-axis.x,axis.x,-step_x do
        love.graphics.points(i,wsize_y-axis.y);
    end

    local x,y = love.mouse.getPosition();

    love.graphics.setColor(0,1,0,1)
    love.graphics.setPointSize(4)

    love.graphics.line(axis.x,y,x,y)

    love.graphics.points(x,y);
    love.graphics.points(axis.x,y);

    love.graphics.print("x="..x.."\ny="..wsize_y-y,axis.x+5,y-15);


    for k,v in ipairs(model) do
        if #v >= 4 then
            love.graphics.setColor(0.5,0.5,0.5,1)
            love.graphics.line(v);
            love.graphics.setColor(0,1,0,1)
            love.graphics.points(v);
        elseif #v ~= nil then
            love.graphics.points(v);
        end
    end

    for k,v in ipairs(model) do
        if #v >=4 then
            for i=1,x,1 do
               collide(v,{x=i,y=y});
            end
        end
    is_collided = {nil};
    end
end

Дурка два, я даже видео снял

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Круто, нечего сказать. Вот тут https://ibb.co/42fkfHt как оно выглядит. Найдя остальные точки строим вот такую https://ibb.co/3ThF6Rp. А потом оформляем обертку в которой пару сварочных гостов, вот эти графики плюс CalculiX для расчёта сварочных деформаций и получаем SysWeld в российском варианте! Как тебе так? И ХЗ кому ее продавать!

Деформации расчетные совпали с реальными до сотой мм. Но эксперимент был всего лишь один, принес очень много вопросов с которыми бодаюсь до сих пор.

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 1)
Ответ на: комментарий от grem

Прогнав вот это

(progn
(defvar *U*)
(defvar *I*)
(defvar *efc*)
(defvar *q*)

(defvar *alpha*)
(defvar *lambda*)
(defvar *gamma*)
(defvar *delta*)
(defvar *c*)
(defvar *v*)
(defvar *a*)
(defvar *b*)

(defvar *y0*)
(defvar *t*)
(defvar *partial-result*)
(defvar *result*))

(progn
(setq *U* 16)
(setq *I* 80)
(setq *efc* 0.7)
;;(setq *q*)

(setq *alpha* 0.0008)
(setq *lambda* 0.1)
(setq *gamma* 7.8)
(setq *delta* 0.3)
(setq *c* 0.16)
(setq *v* 0.3)
;;(setq *a*)
;;(setq *b*)

(setq *t* '(1 2 3 4 6 9 16 25 36))
(setq *y0* '(0 0.3 0.5 0.7 0.9 1 1.1 1.3 1.5 2.0 3.0 4.0 5.0)))


;;(defvar a)
;;(defvar b)
;;(setq a '(10 30 40))
;;(setq b '(1 2 3 4 5 6))
;;(map 'list
;;	(lambda (x)
;;	  (map 'list
;;		  (lambda (y) (* x y))
;;		  b))
;;	a)

;;# Коэффициент температуропроводности а = λ / (cγ), cм^2/сек
;;(setq *a* (/ *lambda* (* *c* *gamma*)))

;;# Коэффициент температуроотдачи	b = (2 * α) / (cγ * δ), 1/сек
;;(setq *b* (/ (* 2 *alpha*) (* *c* *gamma* *delta*)))

;;# Удельный тепловой поток, q	0.24 * U * I * η, кал / сек
;;#  η = *efc*
;;(setq *q* (* 0.24 *efc* *U* *I*))

;;# Ур-ие предельного состояния процесса распростронения тепла при нагреве
;;# пластины мощным быстродвижущимся линейным источником, ºС
;;# T0(y0, t1) = (q / (v * delta * (4 * pi * lambda * c1 * gamma *
;;t)^(1/2))) *
;;# exp (- (y0^2 / (4 * a * t)) - (b * t))

(defun A (*q* *v* *delta* *lambda* *c* *gamma* *t*)
  (/ *q* (* *v* *delta* (sqrt (* 4 pi *lambda* *c* *gamma* *t*)))))

(defun B (*y0* *a* *t* *b*)
  (exp (- (/ (* -1 (* *y0* *y0*)) (* 4 *a* *t*)) (* *b* *t*))))
;;(B *y0* *a* *t* *b*)
;; (setq *t* '(1 2 3 4 6 9 16 25 36))
;; (setq *y0* '(0 0.3 0.5 0.7 0.9 1 1.1 1.3 1.5 2.0 3.0 4.0 5.0))

(defun T (*q* *v* *delta* *lambda* *c* *gamma* *y0* *a* *t* *b*)
  (mapcar
    (lambda (*t*)
      (mapcar
        (lambda (y0)
          (* (A *q* *v* *delta* *lambda* *c* *gamma* *t*)
              (B y0 *a* *t* *b*)))
        *y0*))
    *t*))

;;(defun print-II (II s)
;;  (mapcar (lambda (I)
;;	    (mapcar (lambda (x)
;;		      (princ x s) (princ " " s))
;;		    I)
;;	    (terpri s))
;;	  II))


(defun print-ll (ll s)
  (terpri s t)
  (if (null (car ll)) nil
    (print-ll (mapcar (lambda (l) (princ (car l) s) (princ " " s) (cdr l)) ll) s)))
 
;;А добавить нули второй колонкой как-то так.
 
;;(defun add-0 (ll)
;;  (cons (car ll)
;;    (cons (mapcar (lambda (x) 0) (car ll)) (cdr ll))))
 
;;Использовать вместе (print-ll (add-0 ll))

;;(defun append-to-buffer (buffer start end)
;;"Append the text of the region to BUFFER."
;;(interactive "BAppend to buffer: \nr")
;;(let ((oldbuf (current-buffer)))
;;(save-current-buffer
;;(set-buffer (get-buffer-create buffer))
;;(insert-buffer-substring oldbuf start end))))
(require 'widget)
(eval-when-compile
(require 'wid-edit))

(defun input ()
  (interactive)
  (switch-to-buffer "Линейный подвижный источник в пластине с теплоотдачей (ЛПИПТ)")
  (kill-all-local-variables)
  (let ((inhibit-read-only t))
    (erase-buffer))
  (remove-overlays)
  (widget-insert "        Ввод параметров\n\n")

   (widget-create 'editable-field
		 :size 47
		 :value "'(0 0.3 0.5 0.7 0.9 1 1.1 1.3 1.5 2.0 3.0 4.0 5.0)"
		 :format "Координата, y0:       %v см"
		 :notify (lambda (widget &rest ignore)
			   (setq *y0*
				 (string-to-number
				  (widget-value widget)))))

   (widget-insert "\n")

   (widget-create 'editable-field
		 :size 20
		 :value "'(1 2 3 4 6 9 16 25 36)"
		 :format "Время, t:             %v сек"
		 :notify (lambda (widget &rest ignore)
			   (setq *t*
				 (string-to-number
				  (widget-value widget)))))

   (widget-insert "\n\n")
(widget-insert "Выбор эффективного КПД: \n")
(widget-insert "- при наплавке на плоскость	0.55\n")
(widget-insert "- при сварке встык	        0.7\n")
(widget-insert "- при центральном нпгреве	0.5\n")
(widget-insert "\n")
   (widget-create 'editable-field
		 :size 6
		 :value "0.7"
		 :format "Эффективный КПД:      %v"
		 :notify (lambda (widget &rest ignore)
			   (setq *efc*
				 (string-to-number
				  (widget-value widget)))))

   (widget-insert "\n")

      (widget-create 'editable-field
		 :size 6
		 :value "16"
		 :format "Напряжение:           %v В"
		 :notify (lambda (widget &rest ignore)
			   (setq *U*
				 (string-to-number
				  (widget-value widget)))))

      (widget-insert "\n")

         (widget-create 'editable-field
		 :size 6
		 :value "80"
		 :format "Ток:                  %v А" 
		 :notify (lambda (widget &rest ignore)
			   (setq *I*
				 (string-to-number
				  (widget-value widget)))))

    (widget-insert "\n")

   (widget-create 'editable-field
		 :size 6
		 :value "0.3"
		 :format "Скорость перемещения 
источника тепла, v:   %v см / сек"
		 :notify (lambda (widget &rest ignore)
			   (setq *v*
				 (string-to-number
				  (widget-value widget)))))

    (widget-insert "\n")
    

(widget-create 'editable-field
		 :size 6
		 :value "0.1"
		 :format "Коэффициент 
теплопроводности, λ:  %v кал/см сек ºС"
		 :notify (lambda (widget &rest ignore)
			   (setq *lambda*
				 (string-to-number
				  (widget-value widget)))))

(widget-insert "\n")

(widget-create 'editable-field
		 :size 6
		 :value "0.16"
		 :format "Удельная 
теплоёмкость, с:      %v кал/г ºС"
		 :notify (lambda (widget &rest ignore)
			   (setq *c*
				 (string-to-number
				  (widget-value widget)))))

(widget-insert "\n")


(widget-create 'editable-field
		 :size 6
		 :value "0.0008"
		 :format "Коэффициент 
теплоотдачи, α:       %v кал/см^2 сек ºС"
		 :notify (lambda (widget &rest ignore)
			   (setq *alpha*
				 (string-to-number
				  (widget-value widget)))))

(widget-insert "\n")

(widget-create 'editable-field
		 :size 6
		 :value "7.8"
		 :format "Удельный вес, γ:      %v г/см^3"
		 :notify (lambda (widget &rest ignore)
			   (setq *gamma*
				 (string-to-number
				  (widget-value widget)))))

(widget-insert "\n")

(widget-create 'editable-field
		 :size 6
		 :value "0.3"
		 :format "Толщина пластины, δ:  %v cм"
		 :notify (lambda (widget &rest ignore)
			   (setq *delta*
				 (string-to-number
				  (widget-value widget)))))


(widget-insert "\n\n\n")

 (widget-create 'push-button
		   :notify (lambda (&rest ignore)
			     (progn
;;# Коэффициент температуропроводности а = λ / (cγ), cм^2/сек
(setq *a* (/ *lambda* (* *c* *gamma*)))

;;# Коэффициент температуроотдачи	b = (2 * α) / (cγ * δ), 1/сек
(setq *b* (/ (* 2 *alpha*) (* *c* *gamma* *delta*)))

;;# Удельный тепловой поток, q	0.24 * U * I * η, кал / сек
;;#  η = *efc*
(setq *q* (* 0.24 *efc* *U* *I*))

(setq *partial-result* (T *q* *v* *delta* *lambda* *c* *gamma* *y0* *a* *t* *b*))
(setq *result* (cons *y0* *partial-result*))
(print-ll *result* (generate-new-buffer "file1.dat"))
      
				   );;end of progn
)

"Поехали")
(widget-insert " ") 
  (widget-create 'push-button
                 :notify (lambda (&rest ignore)
                           (input))
                 "Reset")
       (widget-insert "\n")

       (use-local-map widget-keymap)
(widget-setup))

saufesma
() автор топика
Ответ на: комментарий от grem

потом это, а я сечас запустить все это не могу вспомнить как и все увидишь сам

set mxtics 10
set mytics 10
set xlabel 'cm'
set ylabel 'T,C'
set grid mxtics mytics
set label 1 at 0.1, 1800
set label 1 '1 sec'
set label 2 at 0.1, 1400
set label 2 '2 sec'
set label 3 at 0.1, 1100
set label 3 '3 sec'
set label 4 at 0.1, 950
set label 4 '4 sec'
set label 5 at 0.1, 790
set label 5 '6 sec'
set label 6 at 0.1, 640
set label 6 '9 sec'
set label 7 at 0.1, 480
set label 7 '16 sec'
set label 8 at 0.1, 390
set label 8 '25 sec'
set label 9 at 0.1, 250
set label 9 '36 sec'
set arrow 1 nohead from 0, 1200 to 1, 1200
set arrow 2 nohead from 0, 1100 to 1, 1100
set arrow 3 nohead from 0, 600 to 1, 600
set arrow 4 nohead from 0, 200 to 2, 200
plot 'complete-column.dat' using 1:2 with lines, \
''using 1:3 with lines, \
''using 1:4 with lines, ''using 1:5 with lines, \
''using 1:6 with lines, \
''using 1:7 with lines, ''using 1:8 with lines, ''using 1:9 with lines, \
''using 1:10 with lines

saufesma
() автор топика
Ответ на: комментарий от saufesma

Ну по первому графику, можно забабахать, кривые же предрасчитываются, затем масштабируются до пространства экрана и рисуются затем, паралельное оси абцисс это время у тебя оказывается, а точки пересечения соотвецтвие времени с состоянием кривизны кривой. Тут вроде всё понятно, Находим на всех кривых нужные точки в соотвецтвии с тиком времени и сохраняем.

Найдя остальные точки

На кривых точки временные нашли допустимм, а что дальше за точки?

строим вот такую https://ibb.co/3ThF6Rp

Это мы просто берём полученные точки послепервой итерации, отражаем их в отрицательную сторону (я так понял чисто для наглядности) и… а дальше пока не понял (похоже на вид сварочного наплыва сверху :D ) Что этот градиент показывает?

Деформации расчетные совпали с реальными до сотой мм

Круть.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

(я так понял чисто для наглядности)

для знания зон термического влияния где потом твердость мерить и решать как быстро охлаждать или же подогревать металл и т.д.

С построением этих зон пришла другая идея, существует предлинная формула определения температуры по координатам

T (r, y) = A
r = (x + y)^(1/2)
y - он и есть у
Т - берется из диаграммы железо - углерод 4 -5 значений
А- предлинная формула определения температуры по координатам

и я тут подумал а если методом итераций находить х и у при заданной температуре, только вот если вручную задавать х и у то тут какой-то програмный замысел нужен. Я пробовал решить относительно r не вышло уравнение рассыпается в плане размерностей, типа

сек = сек - 1/сек.

saufesma
() автор топика
Последнее исправление: saufesma (всего исправлений: 3)
Ответ на: комментарий от saufesma

Это мало что мне говорит я с матиматикой на вы :D Но суть как я понимаю есть плоскость (на самом деле трёхмерное пространство ибо сварной шов имеет ванночку расплавленного металла, ну да ладно) эта плоскость состоит из металла с теплопроводностью Х в котором содержится углерод количество которого меняет X теплопроводности металла, на этой плоскости мы температурой T (условимся что мгновенно) нагреваем область радиусом R и этот радиус нагреваемой области мы перемещаем по плоскости на скорости S и теперь зная, теплопроводность металла X влияние на него количества углерода (считай меняем марку стали) температуру и скорость перемещения нагреваемой области нам нужно вычислить градиент температур на плоскости подвергающейся температурному воздействию, далее нам надо посчитать относительно кофиэциента расширения материала в зависимости от температуры на нашей плоскости степень деформации маталла так что-бы узнать в каких местах степень деформации такова что вредна и требует дополнительного нагрева области дабы сгладить температурный градиент так что-бы исключить напряжения в металле из за разницы температур. И все эти расчёты нужны ровно потому что мы не можешь всё свариваемое изделие нагреть до такой температуры при сварке что градиенты сгладятся автоматически и мы не можем даже после сварки отпустить металл прогревая его, именно поэтому нам нужно вычислить что после сварной точки нам нужно греть, сколько и как сильно.

Я всё вот так вот понял :D К сварке и математике отношение имею нулевое.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от saufesma

Ну из всего него тебе по надо (учитывая называния темы) только 1 функция point_intersect_line для нахождения пересечения «луча/точки/линии» с линией между двумя точками кривой. Всё остальное просто визуализация. Только у меня всё в координатах экрана и кривые от руки рисуются , а у тебя в своей системе координат и кривые предрасчитанные, но один фиг твои кривые это всё равно точки по которым ты кривые строишь так что чисто нахождение пересечения будет работать с чем угодно оно же float там везде, да и переписать на том на чём пишешь ты можно ибо я специально всё сделал на простых умножениях, делениях и прочем. Визуализацию пересечения можно просто всю выкинуть, тебе результат пересечений нужен для дальнейших вычислений же просто.

Вот на Сях

#include <math.h>
#include <stdio.h>

struct vec2
{
    float x;
    float y;
};

struct line
{
    struct vec2 start;
    struct vec2 end;
};

int point_intersect_line(struct vec2 line_start,struct vec2 line_end,struct vec2 point,float radius)
{

    struct vec2 v1 = {.x=0,.y=0};
    struct vec2 v2 = {.x=0,.y=0};
    struct vec2 v3 = {.x=0,.y=0};
    struct vec2 v4 = {.x=0,.y=0};
    struct vec2 normalized = {.x=0,.y=0};

    v1.x = line_end.x - line_start.x;
    v1.y = line_end.y - line_start.y;

    v2.x = point.x - line_start.x;
    v2.y = point.y - line_start.y;

    float len = sqrt(v1.x * v1.x + v1.y * v1.y);

    normalized.x = v1.x / len;
    normalized.y = v1.y / len;

    len = sqrt(v2.x * v2.x + v2.y * v2.y);
    v3.x = normalized.x * len;
    v3.y = normalized.y * len;

    if( (v3.x * v1.x) + (v3.y * v1.y) < 0 )
    {
        return 0;
    }

    if ((v3.x * v3.x + v3.y * v3.y) > (v1.x * v1.x + v1.y * v1.y))
    {
        return 0;
    }

    v4.x = v2.x - v3.x;
    v4.y = v2.y - v3.y;
    len = (v4.x * v4.x + v4.y * v4.y);

    if( len < radius)
    {
        return 1;
    }

    return 0;
}

int main(int argc, char *argv[])
{
    //линия с котрой ищем пересечение
    struct line line =
    {
        .start.x = 10,
        .start.y = 10,
        .end.x   = 500,
        .end.y   = 500,
    };

    //луч / точка торую двигаем по оси Х до пересечения
    //с фиксированной (или нет) координатой Y
    struct vec2 point =
    {
        .x = 0,   // начинаем строить луч с 0
        .y = 160, // от балды
    };

    //шаг луча, можно сделать его float
    //если нужна точность
    //если raystep слишком большой, то он может перелететь
    //точку перечения и столкновения его с прямой не будет
    //и мы не узнаем точку пересечения.
    //но я шаг ниже указал в параметре функции как радиус
    //и мы не потеряем пересечение так что будет страдать только точность
    //но конкретно тут точность не страдает у меня тут целые числа и шаг 1 самый точный
    int raystep = 1;
    //это по сути предел кооринат по X
    //у нас же не бесконечная плоскость
    //на котрой мы ищем пересечение, выбирам наибольшее значение
    //на кривых по X и всё. Тоже может быть float без разницы вообще
    int MAX_X = 1000;

    //пускаем точку в полёт до пересечения
    for (size_t i = 0; i < MAX_X; ++i)
    {
        point.x = i; // двигаем её по нужной нам оси (осям)
        //и проверяем есть ли пересечение
        //raystep в качестве радиуса, можно писать отдельно хоть 0.1
        //но тогда шаг должен быть float и меньше радиуса так как радиус это область 
        //в котрой пересечение и если шаг больше то радиус может быть
        // перешагнут лол. 
        if (point_intersect_line(line.start,line.end,point,raystep))
        {
            printf("Пресечение линии start [x:%f y:%f] end [x:%f y:%f] в точке [x:%f y:%f]\n",
                  line.start.x,line.start.y,line.end.x,line.end.y,point.x,point.y);
            return 0;
        }else{
            //printf("Нет пресечения линии [x:%f y:%f] [x:%f y:%f]\n",
            //line.start.x,line.start.y,line.end.x,line.end.y,point.x,point.y);
        }
    }

    return 0;
}
dron@gnu:~$ gcc tt.c -lm
dron@gnu:~$ ./a.out 
Пресечение линии start [x:10.000000 y:10.000000] end [x:500.000000 y:500.000000] в точке [x:159.000000 y:160.000000]
dron@gnu:~$ 
LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)