Schöck
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Интерполяция между двумя точками

Интерполяция между двумя точками

Ответ
Поиск в этой теме
Непрочитано 15.05.2009, 18:29 #1
Интерполяция между двумя точками
postbudka
 
Маркшейдер
 
Макеевка
Регистрация: 02.11.2008
Сообщений: 146

Есть ли программка (лисп) для интерполяции между двумя точками с указанными значениями.
Если есть, дайте пожалуйста ссылку (поиском пользовался, кое какие программы нашлись, но они выдают немного не тот конечный результат, который хотелось бы (простановка точек)).
Если нет, то не соблаговолят ли шарящие в лиспе товарищи помочь в написании. Думаю, что задача не очень сложная, особенно для тех, кто знает лисп.

Как я это представляю себе:
1. Указываем первую точку;
2. Вводим значение (высотную отметку, мощность и т.п.) первой точки;
3. Указываем вторую точку;
4. Вводим значение второй точки.
5. Вводим шаг интерполяции (допустим 0,5 или 1,0 м)
6. Результат - простановка точек между указанными вершинами согласно их (вершин) значений и шага (если бы ещё и подписывались - это вообще было бы круто!)

Плиз, очень надо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Просмотров: 11736
 
Непрочитано 15.05.2009, 19:15
#2
sasha_lif

Дизайнер-конструктор
 
Регистрация: 29.05.2004
Kiev
Сообщений: 1,182
<phrase 1=


Интерполяция между двумя точками - ты хочешь прямую линию??? и на ней точки??, ил ичтобы грубо говоря, сплайном скругляло между НЕСКОЛЬКИМИ точками?

если первое (прямая линия) =то пробуй _divide или _measure , предварительно поставь стиль точки в какой-нибудь кружок

По второму случаю- не подскажу
__________________
Kiev, Ukraine
sasha_lif вне форума  
 
Непрочитано 15.05.2009, 19:48
#3
sbi


 
Регистрация: 27.04.2008
SPB
Сообщений: 3,293
Отправить сообщение для sbi с помощью Skype™


А понятие интерполяции знакомо? По общему счёту все кривые в каде апроксимилируются отрезками прямых с определенным шагом.
__________________
С уважением sbi
sbi вне форума  
 
Непрочитано 15.05.2009, 19:56
#4
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,063


_spline
по двум точкам интерполяцию не сделаешь...
для получения интерполяционного многочлена требуется как можно больше точек для точности
Хмурый вне форума  
 
Автор темы   Непрочитано 15.05.2009, 20:01
#5
postbudka

Маркшейдер
 
Регистрация: 02.11.2008
Макеевка
Сообщений: 146


Да, нужны точки на прямой, соединяющей 2 вершины, но без прямой. Команды divide и measure не подходят, т.к. они отталкиваются от одной из вершин и далее разбивают прямую на одинаковые отрезки. У меня другой вариант, попытаюсь объяснить подробней:
Есть 2 вершины, расстояние между ними 100 метров, отметка первой вершины +1,1 метра, отметка второй вершины +2,65 метра, шаг интерполирования 0,5 метра. Т.е. нужно проставить на прямой, соединяющей эти вершины, точки с отметками +1,5, +2,0 и 2,5 метра. В данном примере между вершинами будет 3 точки с расстояниями 25,8, 32,2, 32,2 и 9,8 метра между ними.

1. Вызываю команду
2. Указываю первую вершину
3. Ввожу "1.1"
4. Указываю вторую вершину
5. Ввожу "2.65"
6. Ввожу шаг "0.5"
Результат: 3 точки (в идеале подписанные) с расстояниями: вер.1 - т.+1.5 - 25,8 м; т.+1.5 - т.+2.0 - 32,2 м; т.+2.0 -т.+2.5 - 32,2 м; т.+2.5 - вер.2 - 9,8 м
Потом, получив таким образом кучу точек, я сам соединю их с одинаковыми отметками сплайном
Надеюсь объяснил подробно
postbudka вне форума  
 
Непрочитано 15.05.2009, 20:04
#6
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,063


это не интерполяция
не проще-ли использовать команду _offset
Миниатюры
Нажмите на изображение для увеличения
Название: SpxImage106.jpg
Просмотров: 417
Размер:	27.0 Кб
ID:	20438  

Последний раз редактировалось Хмурый, 15.05.2009 в 20:12.
Хмурый вне форума  
 
Автор темы   Непрочитано 15.05.2009, 20:11
#7
postbudka

Маркшейдер
 
Регистрация: 02.11.2008
Макеевка
Сообщений: 146


Ну хорошо, не интерполяция! Разбивка точек?! Или как это по науке назвать? Гипотетически лиспик можно сбацать???
postbudka вне форума  
 
Непрочитано 15.05.2009, 20:13
#8
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,063


Цитата:
Сообщение от postbudka Посмотреть сообщение
Ну хорошо, не интерполяция! Разбивка точек?! Или как это по науке назвать? Гипотетически лиспик можно сбацать???
см. моё предыдущее сообщение.
Хмурый вне форума  
 
Автор темы   Непрочитано 15.05.2009, 20:21
#9
postbudka

Маркшейдер
 
Регистрация: 02.11.2008
Макеевка
Сообщений: 146


Да я всё понимаю. Сам так делал. Но это сколько ж разрезов нужно построить, если у меня допустим 100 точек. Можно и без разрезов: длину между вершинами померял, калькулятор в руки и вперёд! Поэтому я и прошу (умоляю) сделать программку. Мне кажется так будет намного быстрее.
postbudka вне форума  
 
Непрочитано 15.05.2009, 20:29
#10
Рyslan


 
Регистрация: 25.07.2007
Сообщений: 2,431


2 бакса
Рyslan вне форума  
 
Непрочитано 15.05.2009, 20:36
#11
sbi


 
Регистрация: 27.04.2008
SPB
Сообщений: 3,293
Отправить сообщение для sbi с помощью Skype™


Цитата:
Сообщение от Рyslan Посмотреть сообщение
2 бакса
4 бакса, кто больше?
Да, забыл сказать, скобки не умею расставлять, а на другом языке можно?
__________________
С уважением sbi

Последний раз редактировалось sbi, 15.05.2009 в 20:44. Причина: Склероз
sbi вне форума  
 
Непрочитано 16.05.2009, 16:47
#12
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Цитата:
Сообщение от postbudka Посмотреть сообщение
Ну хорошо, не интерполяция! Разбивка точек?! Или как это по науке назвать? Гипотетически лиспик можно сбацать???
"Сбацать" конечно же можно, только требуются дополнения к ТЗ ...
Поэтому для начала пока так:
Пусть имеются две точки
Код:
[Выделить все]
(setq pt '(0.0 1.1))
(setq pt1 '(100.0 2.65))
Далее пишеи простенькую программу, которая находит координату точки в зависимости от этих точек и значения высотной отметки
Код:
[Выделить все]
(defun test (a b y)
  ((lambda (k)
     (list (/ (- y (- (cadr a) (* k (car a)))) k) y)
   ) ;_ end of lambda
    (apply '/ (reverse (mapcar '- b a)))
  )
) ;_ end of defun
;;;(test pt pt1 1.1)
;;;(0.0 1.1)
;;;(test pt pt1 2.65)
;;;(100.0 2.65)
;;;(test pt pt1 1.5)
;;;(25.8065 1.5)
Дальше пока не понятно - кто должен указать программе, что начинать считать нужно с отметки 1.5?
Задаем пока вручную...
Код:
[Выделить все]
(setq lst
       (mapcar '(lambda (x)
                  (test pt pt1 x)
                ) ;_ end of lambda
               '(1.1 1.5 2. 2.5 2.65)
       ) ;_ end of mapcar
) ;_ end of setq
;;;-> ((0.0 1.1) (25.8065 1.5) (58.0645 2.0) (90.3226 2.5) (100.0 2.65))
Ну и
Цитата:
В данном примере между вершинами будет 3 точки с расстояниями 25,8, 32,2, 32,2 и 9,8 метра между ними.
Код:
[Выделить все]
((lambda (lst)
   (mapcar '- (cdr lst) lst)
 ) ;_ end of lambda
  (mapcar 'car lst)
)
-> (25.8065 32.2581 32.2581 9.67742)
Цитата:
Потом, получив таким образом кучу точек, я сам соединю их с одинаковыми отметками сплайном
???
CB вне форума  
 
Автор темы   Непрочитано 16.05.2009, 22:05
#13
postbudka

Маркшейдер
 
Регистрация: 02.11.2008
Макеевка
Сообщений: 146


Цитата:
Дальше пока не понятно - кто должен указать программе, что начинать считать нужно с отметки 1.5?
Она сама должна вычислить. Я так понимаю, нужно определить минимум (1.1) и далее первое значение с целым остатком от деления на шаг: 1.5/0.5=3, но эта отметка не должна быть больше второго значения (1.5=<2.65)
А результат работы этой программы: она просто определяет длины между точками или наносит их?
postbudka вне форума  
 
Непрочитано 17.05.2009, 14:00
#14
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Код:
[Выделить все]
(defun C:test (/ pt pt1 y s)
  (setq pt (getpoint "\nПервая точка: "))
  (setq pt1 (getpoint "\nВторая точка: "))
  (setq s (getreal "\nШаг: "))
  (mapcar
    '(lambda (x)
       (entmakex
         (list '(0 . "POINT") (cons 10 x))
       ) ;_ end of entmakex
     ) ;_ end of lambda
    (list pt pt1)
  ) ;_ end of mapcar
  (setq y 0)
  ((lambda (y k / x)
     (while (< (cadr pt) y (cadr pt1))
       (setq x (+ (* y k) (- (car pt) (* k (cadr pt)))))
       (entmakex
         (list '(0 . "POINT") (cons 10 (list x y)))
       ) ;_ end of entmakex
       (setq y (+ y s))
     ) ;_ end of while
   ) ;_ end of lambda
    (while (<= y (cadr pt)) (setq y (+ y s)))
    (apply '/ (mapcar '- pt1 pt '(0 0)))
  )
) ;_ end of defun
CB вне форума  
 
Автор темы   Непрочитано 17.05.2009, 22:37
#15
postbudka

Маркшейдер
 
Регистрация: 02.11.2008
Макеевка
Сообщений: 146


А можно добавить запрос на ввод первого и второго значения для соответствующих точек?
postbudka вне форума  
 
Непрочитано 18.05.2009, 00:10
#16
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Да добавить то можно, но
1. Это текстовые переменные или числа?
2. Где они должны быть задействованы?
CB вне форума  
 
Автор темы   Непрочитано 18.05.2009, 20:56
#17
postbudka

Маркшейдер
 
Регистрация: 02.11.2008
Макеевка
Сообщений: 146


1. Это числа;
2. Задействованы они должны быть только в данном конкретном случае. При интерполяции между двумя другими точками будут другие значения и т.д. (если я правильно понял вопрос).
postbudka вне форума  
 
Непрочитано 18.05.2009, 23:12
#18
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,150


postbudka, держи лиспу, накорябаную для оцифровки кривых в ХУ-координатах. Выдает таблицу в excell. Требования: кривая должна быть полилинией.
Код:
[Выделить все]
(defun C:XY ( / adoc util LIQ VAP pt0 pt1 par_ln refs par xy n)
  (vl-load-com)
  (defun IntPnts (ln pt ang / xln)
    (setq xln (vla-addline csp (vlax-3d-point pt) (vlax-3d-point (polar pt ang 0.1)))
	  ips (vlax-safearray->list (vlax-variant-value (vla-IntersectWith ln xln acExtendOtherEntity))))
    (vla-delete xln)
    ips
  );defun
; 
  (setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
        util (vla-get-utility adoc))
  (vla-getentity util 'cur nil "\nВыбрать кривую: ")
  (vla-InitializeUserInput util 128)
  (setq kw1 (vla-getKeyWord util "Единицы Y [Actual/Fraction]: <Fraction>"))  
  (if (= kw "A") (setq VA (vla-getReal util "Ввести наибольшее значение: ")
		       VB (vla-getReal util "Ввести наименьшее значение: ")
		       DV (vla-getReal util "Ввести инкремент: "))
    (progn  (setq refs (vla-getInteger util "\nВвести число точек: "))));if 
  (setq pt0 (vlax-curve-getStartPoint cur)
	pt1 (vlax-curve-getEndPoint cur)
	csp (vla-ObjectIDtoObject adoc (vla-get-ownerID cur))		
;	refs (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-getInteger (list util "\nNumber of Points <10>: ? "))) 10)
	par_ln (vla-addLightWeightPolyline csp (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 3))
		       (list (car pt0) (cadr pt0) (car pt1) (cadr pt1)))))
	par 0.000 XY nil n 0);setq
  (vla-InitializeUserInput util 128)
  (setq kw2 (vla-getKeyWord util "Калибровать ось X [Yes/No]: <No> ?")) 
  (if (= kw1 "") (setq kw1 "F")) (if (= kw2 "") (setq kw2 "N"))
  (if (= kw2 "N") (setq kw2 1)
    (progn (vla-getentity util 'cl nil "\Выбрать калибровочную линию: ")
      (setq cpt (vlax-safearray->list (vlax-variant-value (vla-IntersectWith cl par_ln 0)))
	    cv (/ (vla-getReal util "Ввести калибровочное значение: ") (vlax-curve-getParamAtPoint par_ln cpt))));if
  (while (< par 1.000)    
    (setq pnt (vlax-curve-getPointAtParam par_ln par))
    (if (= kw "A") (setq X (vlax-curve-getParamAtPoint par_ln (IntPnts par_ln (IntPnts cur pnt 0) (/ pi 2)))
			 XY (cons (list (* cv X) (+ VB (* par (- VA VB)))) XY)
			 par (+ par (/ DV (- VA VB))))
      (setq X (IntPnts cur pnt (/ pi 2)
	    XY (cons (list par (+ VB (* (vlax-curve-getParamAtPoint par_ln X) (- TA TB)))) XY)
	    (setq par  (+ par (/ 1.000 refs)))))));while
  (setq XY (reverse XY))
  (vla-delete par_ln)

  (setq ch_ex (vlax-get-or-create-object "Excel.Application"))
  (mapcar '(lambda (x y) (vlax-put-property ch_ex x y)) '(SheetsInNewWorkbook Visible) '(1 :vlax-true))
  (setq ch_shs (vlax-get-property (vlax-invoke-method (vlax-get-property ch_ex 'Workbooks) 'Add) 'Sheets)
	ch_csh (vlax-get-property ch_shs 'Item 1))
  (vlax-put-property ch_csh 'Name "Кривая")

  (while (<= n (length XY))
    (setq col (mapcar '(lambda (x) (strcat x (itoa (1+ n)))) '("A" "B" "C"))
	  rngs (mapcar '(lambda (x) (vlax-get-property ch_ex "Range" x)) col))
    (mapcar '(lambda (x y) (vlax-put-property x "value2" y)) rngs
	    (if (= n 0) '("Точка" "X" "Y") (cons n (nth (1- n) XY))))
    (setq n (1+ n)));while

  (mapcar '(lambda (x) (if (and x (not (vlax-object-released-p x))) (vlax-release-object x)))
	  (list ch_csh ch_shs ch_ex))
  (gc)
);end
Лентяй вне форума  
 
Непрочитано 19.05.2009, 10:53
#19
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Цитата:
Сообщение от postbudka Посмотреть сообщение
если я правильно понял вопрос.
Наверное не правильно. Вот что я имел в виду:
1. Запрос на на ввод первого и второго значения можно сделать по разному

Код:
[Выделить все]
 
(getstring "\nВведите высотную отметку для первой точки: ")
 
-> Введите высотную отметку для первой точки: 1.1
"1.1"
или
Код:
[Выделить все]
 
(getreal "\nВведите высотную отметку для первой точки: ")
-> Введите высотную отметку для первой точки: 1.1
1.1
Видно, что первый ввод - это текст, второй - число.
2. Теперь главное - ДЛЯ ЧЕГО ЭТО НУЖНО. Если в программу вводится переменная - она должна где-то использоваться. Вопрос - где?
Если нужно просто подписать эти значения над точками - должен быть текст.
Если нужно дальше что-то считать, лучше число (хотя текст перевести в число можно (rtos 1.1) -> "1.1")
Число (ИМХО) можно в принципе применить для пересчета значений высотных отметок. Что я имею в виду.
Пусть, к примеру, начальная точка имеет координаты '(30 15), конечная '(100 60).
Делаем запрос на на ввод первого значения - например 3.
Т.е. 15 соответствует значению 3 -> k= 15/3 = 5.
Отсюда вопрос - зачем делать запрос на на ввод второго значения, оно вычисляется - 60/5=12 ???

Последний раз редактировалось CB, 19.05.2009 в 11:13.
CB вне форума  
 
Автор темы   Непрочитано 19.05.2009, 19:09
#20
postbudka

Маркшейдер
 
Регистрация: 02.11.2008
Макеевка
Сообщений: 146


to CB:
Мы наверное друг друга немного недопонимаем. Крутимся где-то рядом. Попытаюсь максимально подробно описать ситуацию: я работаю на шахте, есть план горных выработок с нанесенными скважинами по шахтному полю. Мне нужно построить изомощности непосредственной кровли пласта - сланца. По каждой скважине есть значение мощности сланца. Изомощности мне нужно провести на всём поле через каждые 0,5 метра (это шаг интерполяции, в данном случае он равен 0,5, в другом случае может быть иным, поэтому и нужен запрос на ввод значения шага). Указывая первую точку, я указывая одну скважину, указывая вторую точку - вторую скважину. Вводимые значения мощностей - ЧИСЛА, их подписывать не надо и далее эти значения нигде использоваться не будут. Подписать желательно было бы те точки, которые находятся МЕЖДУ скважинами для лучшей ориентации при дальнейшем соединении точек с одинаковыми отметками. Вот эти подписи - ТЕКСТ. Далее я указываю следующую пару точек и их значения, получаю ещё точки. И так далее по всему полю. Потом вручную соединяю все точки о одинаковым значением сплайном.
Не совсем, вернее совсем не врубился во фразу:
Цитата:
Пусть, к примеру, начальная точка имеет координаты '(30 15), конечная '(100 60).
Делаем запрос на на ввод первого значения - например 3.
Т.е. 15 соответствует значению 3 -> k= 15/3 = 5.
Отсюда вопрос - зачем делать запрос на на ввод второго значения, оно вычисляется - 60/5=12 ???
Значения крайних точек абсолютно самостоятельные и не вычисляются относительно друг друга.
postbudka вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Интерполяция между двумя точками

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
арифметические действия между двумя текстовыми элементами RЯков AutoCAD 31 09.09.2016 11:13
Вопрос по 3D: Как образмерить угол между двумя отрезками, находящимися в разных плоскостях? k8t AutoCAD 21 03.11.2015 09:29
создание касательной между двумя окружностями фрекен_бок AutoCAD 1 21.02.2009 22:14
Как определить расстояние между 2 точками по spline? Хотабыч Программирование 5 22.01.2006 15:33