Тема: Нужна программа для спрямление внутренних углов прямоугольника

Я занимаюсь оцифровкой и иногда прямоугольник получается не точно с прямыми углами, может у кого нить есть такая программка которая бы их делала точно 90 градусов, и желательно не по одному, а все сразу(чтобы нажал на этот прямоугольник и все углы в прямоугольнике стали 90 градусов)
спасибо
с Уважением Михаил

Re: Нужна программа для спрямление внутренних углов прямоугольника

> Михаил
Какие средства и методы используются для оцифровки? Что цифруем???

Re: Нужна программа для спрямление внутренних углов прямоугольника

Я в подобных случаях просто отрисовываю прямоугольник. IMHO, если выполнить операцию спрямления косого "прямоугольника", то он развалится на несопряженные отрезки (если он рисовался из отрезков).

Re: Нужна программа для спрямление внутренних углов прямоугольника

Вероятно, при этом должны выполняться и дополнительные условия. Например, площадь новой фигуры должна быть равна площади прежней "неправильной". Или смещения вершин от исходных положений должны быть минимальными. Либо все вместе.

Re: Нужна программа для спрямление внутренних углов прямоугольника

конечно сразу прямоугольник рисовать правильнее, но а если он под углом??, я просто думал может уже кто то для удобства написал такую прогу, раз нет тогда и я буду как все!!!
ВСЕМ ОГРОМНОЕ СПАСИБО
с Уважением Михаил

Re: Нужна программа для спрямление внутренних углов прямоугольника

> Михаил
В принципе, можно повернуть UCS (ПСК) вокруг оси Z и рисовать прямоугольник.

Re: Нужна программа для спрямление внутренних углов прямоугольника

> Михаил
с учетом > VH (2005-12-01 09:47:53)
покопаюсь, кинусь, но не сегодня...

Re: Нужна программа для спрямление внутренних углов прямоугольника

Предлагаю такой простенький вариант
со следующим алгоритмом:
на входе полилиния с 4-мя вершинами
(и только с 4-мя, предположительно
замкнутая т.е. четырехугольник)
программа меняет расположение только 2-ой и 3-ей
вершин до образования прямоугольника сдвигая их
по прямой проведенной из 2-ой в 3-ю вершину до
их преобразования.
;
;вызов из командной строки rect-reht
;

(defun c:rect-reht (/ nth-2 obj coord pt ang dist)
    (defun nth-2 (x1 x2) (list (nth x1 coord) (nth x2 coord)))
    (setq obj (vlax-ename->vla-object (car (entsel))))
    (if
        (and obj
             (eq (vla-get-ObjectName obj) "AcDbPolyline")
             (/= (vla-get-lock
                     (vla-item (vla-get-layers
                                   (vla-get-activedocument
                                       (vlax-get-acad-object)
                                   )
                               )
                               (vla-get-layer obj)
                     )
                 )
                 :vlax-true
             )
             (eq (length (setq coord (vlax-safearray->list
                                         (vlax-variant-value
                                             (vla-get-Coordinates obj)
                                         )
                                     )
                         )
                 )
                 8
             )
        )
           (progn
               (setq dist (/ (distance (nth-2 0 1) (nth-2 4 5)) 2.0)
                     pt   (list (/ (+ (nth 0 coord) (nth 4 coord)) 2.0)
                                (/ (+ (nth 1 coord) (nth 5 coord)) 2.0)
                          )
                     ang  (angle (nth-2 2 3) (nth-2 6 7))
               )
               (vla-put-Coordinates
                   obj
                   (vlax-safearray-fill
                       (vlax-make-safearray vlax-vbDouble '(0 . 7))
                       (append (nth-2 0 1)
                               (polar pt (+ pi ang) dist)
                               (nth-2 4 5)
                               (polar pt ang dist)
                       )
                   )
               )
               (princ "\n Прямоугольник преобразован.")
           )
           (princ "\n Неверные данные ...")
    )
    (princ)
)

Re: Нужна программа для спрямление внутренних углов прямоугольника

> Михаил
То же но с сохранением прежней площади:

;; Локальные функции:
;;   ***  разность двух углов  ***  ;;
;; written by Fatty T.O.H. (c) 2004 ;;
;;        all rights removed         ;
(defun dif-angle (ang1 ang2 / def)
  (set 'ang1
       (if (> ang2 (+ pi ang1))
     (+ (* pi 2) ang1)
     ang1
       )
  )
  (set 'ang2
       (if (> ang1 (+ pi ang2))
     (+ (* pi 2) ang2)
     ang2
       )
  )
  (setq def (- ang2 ang1))
)
;;***    проверка направления полилинии   *** ;;
;;      written by Fatty T.O.H. (c) 2004      ;;
;;            all rights removed              ;;
;; возвращает Т если полилиния нарисована против
;; часовой стрелки если (getvar "angdir") = 0
(defun ccw-test    (pt_list / angle_list)
  (setq    angle_list
     (mapcar (function (lambda (x y)
                 (angle x y)
               )
         )
         pt_list
         (cdr pt_list)
     )
  )
  (if (> (apply    '+
        (mapcar    (function (lambda (x y) (dif-angle x y)))
            angle_list
            (cdr angle_list)
        )
     )
     0
      )
    t
    nil
  )
)
;;        ***   main part   ***            ;;
(defun C:RCN (/ ang1 ang2 ar1 coors elist ent len len1
          len2 osm p1 p2 p3 p4 pt_list rect wid wid1 wid2)
(defun *error* (msg)
 (cond
  ((or (not msg)
       (member msg '("console break"
                     "Function cancelled"
                     "quit / exit abort"))))
  ((princ (strcat "\nError: " msg)))
 )
 (command "undo" "e")
 (setvar "cmdecho" 1)
 (princ)
) ;end
(setq osm (getvar "osmode"))
(command "undo" "e")
(command "undo" "be")
(while
    (or
      (not (setq ent (entsel "\nВыбрать прямоугольник: ")))
      (not (wcmatch  (cdr (assoc 0
        (setq elist (entget
        (setq rect (car ent)))))) "*POLYLINE")))
    (princ "\nНеверный тип объекта, выход ")
  )
(if rect
  (progn
    (setq coors (vl-remove-if (function not)
          (mapcar (function (lambda (x)
            (if (eq 10 (car x))(cdr x))))
    elist)))
    (setq p1 (car coors)
      p2 (cadr coors)
      p3 (caddr coors)
      p4 (cadddr coors)
      ang1 (angle p1 p2)
      ang2 (if (ccw-test coors)(+ (/ pi 2) ang1)(- ang1 (/ pi 2) ))
      len1 (distance p1 p2)
      len2 (distance p4 p3)
      wid1 (distance p2 p3)
      wid2 (distance p4 p1)
      ar1 (vlax-curve-getarea rect)
      len (/ (+ len1 len2) 2)
      wid (/ ar1 len)
      p2 (polar p1 ang1 len)
      p3 (polar p2 ang2 wid)
      p4 (polar p1 ang2 wid)
      pt_list (apply 'append (list p1 p2 p3 p4))
)
(vlax-put (vlax-ename->vla-object rect) 'Coordinates pt_list)
)
)
(*error* nil)
(princ)
)

~'J'~

Re: Нужна программа для спрямление внутренних углов прямоугольника

> AY

> Олег(jr.)
Эффектно работают программы. Может, Михаил'а они и устроят. Но вот, если надо восстановить и ортогональность и РАЗМЕРЫ сторон? Скажем, у меня есть сканированное изображение фасада, выполненного вручную в масштабе 1:200. Понятно, что никакой точности в этом изображении нет вообще. То, что на бумаге выглядит хорошо, на экране выглядит так, что плеваться хочется. Линии не ортогональны, размеры далеки от реальных, вообще нет ни одной горизонтальной или вертикальной линии, да плюс сами линии получились жирными. Я обвожу окно по серединам этих жирных линий. Но я знаю, что окно имеет размеры 1200х1500 мм. На экране в мвсштабе 1:200 размеры черт знает какие. После обводки получился непрямоугольный, неортогональный четырехугольник. По одной из этих программ я его выпрямил до ортогональности или спрямил с сохранением площади. Но размеры? Размеры все равно черт знает, какие, потому что четырехугольник на экране нарисован "на глазок". Кто-нибудь может рисовать в AutoCAD'е НЕ ТОЧНО? Я не могу. Вот и получается, что мне удобнее сразу нарисовать прямоугольник, который рисуется всегда ортогонально, с размерами 60х75 (1:200). Конечно, бывает, что размеры элементов чертежа неизвестны или несущественны, или выводиться будут в мелком масштабе, тогда да, нарисовал быстренько, абы как, и выпрямил. Может, это кого-то и устроит, но это - уход от точности построения. Можно, конечно, ввести в программу запросы на размеры прямоугольника, но тогда весь смысл пропадает. Ну, и в случае наклонных прямоугольников тоже не все однозначно. Это не критика самих программ, это просто соображения по их применению.

Re: Нужна программа для спрямление внутренних углов прямоугольника

> Владимир Громов
ИМХО: создавать временный блок и позиционировать его. Фактически то же самое, что и руками. Эффективность программного решения близка к нулю (я не говорю об эффектности!).

Re: Нужна программа для спрямление внутренних углов прямоугольника

Рисовалка полилиний со всеми отрезками под прямым углом. Есть возможность автоматического замыкания полилинии на первую точку (для нечетных узлов). Например, если задал 3 точки и опцию Close, то программа отрисовывает прямоугольник.
Програма RB. Очень помогает при оцифровке.
http://geol-dh.ru/kai_stru.html

Re: Нужна программа для спрямление внутренних углов прямоугольника

Прямоугольник называется прямоугольником, потому-что все углы имеют значение 90 градусов.
Поясните:
Вы имеете прямоугольник повёрнутый относительно UCS на некий угол, или же четырёхуголник с неравными углами, которые нужно преобразовать до прямоугольника?

Re: Нужна программа для спрямление внутренних углов прямоугольника

Смотрите я оцифровывю старый планшет и при оцифровке прямоугольника котороый может быть тоже не с углами 90 градусов, а к примеру 85-89(топограф такой был) когда я обвожу это "прямоугольник" я же не точно попадаю в точки соответственно делаю еще ошибку углы тоже меняются, так мне надо чтобы  углы становились равными по 90 градусов!
врде попытался объяснить
спасибо
с Уважением Михаил

Re: Нужна программа для спрямление внутренних углов прямоугольника

Пытаюсь запустить Ваши проги, а мне вот что пишут: Select object: ; error: no function definition: VLAX-ENAME->VLA-OBJECT

Re: Нужна программа для спрямление внутренних углов прямоугольника

а вторая программа(RCN) вот что выдает:
Error: no function definition: VLAX-CURVE-GETAREAundo Enter the number of
operations to undo or [Auto/Control/BEgin/End/Mark/Back] <1>: e
наверное я что то не так делаю, или тупо объясняю!!!

Re: Нужна программа для спрямление внутренних углов прямоугольника

> Михаил
Для работы программ необходимо загрузить функцию

(vl-load-com)

Re: Нужна программа для спрямление внутренних углов прямоугольника

а можно поподробнее?
спасибо

Re: Нужна программа для спрямление внутренних углов прямоугольника

> Михаил
Забыл добавить загрузку функций ActiveX,
как правильно сказал Владимир Громов

;; Локальные функции:
;;   ***  разность двух углов  ***  ;;
;; written by Fatty T.O.H. (c) 2004 ;;
;;        all rights removed         ;
(defun dif-angle (ang1 ang2 / def)
  (set 'ang1
       (if (> ang2 (+ pi ang1))
   (+ (* pi 2) ang1)
   ang1
       )
  )
  (set 'ang2
       (if (> ang1 (+ pi ang2))
   (+ (* pi 2) ang2)
   ang2
       )
  )
  (setq def (- ang2 ang1))
)
;;***    проверка направления полилинии   *** ;;
;;      written by Fatty T.O.H. (c) 2004      ;;
;;            all rights removed              ;;
;; возвращает Т если полилиния нарисована против
;; часовой стрелки если (getvar "angdir") = 0
(defun ccw-test  (pt_list / angle_list)
  (setq  angle_list
   (mapcar (function (lambda (x y)
           (angle x y)
         )
     )
     pt_list
     (cdr pt_list)
   )
  )
  (if (> (apply  '+
    (mapcar  (function (lambda (x y) (dif-angle x y)))
      angle_list
      (cdr angle_list)
    )
   )
   0
      )
    t
    nil
  )
)
;;    ***   main part   ***      ;;
(defun C:RCN (/ ang1 ang2 ar1 coors elist ent len len1
        len2 osm p1 p2 p3 p4 pt_list rect wid wid1 wid2)
[b](vl-load-com)[/b]
(defun *error* (msg)
 (cond
  ((or (not msg)
       (member msg '("console break"
                     "Function cancelled"
                     "quit / exit abort"))))
  ((princ (strcat "\nError: " msg)))
 )
 (command "undo" "e")
 (setvar "cmdecho" 1)
 (princ)
) ;end
(setq osm (getvar "osmode"))
(command "undo" "e")
(command "undo" "be")
(while
    (or
      (not (setq ent (entsel "\nВыбрать прямоугольник: ")))
      (not (wcmatch  (cdr (assoc 0
    (setq elist (entget
    (setq rect (car ent)))))) "*POLYLINE")))
    (princ "\nНеверный тип объекта, выход ")
  )
(if rect
  (progn
    (setq coors (vl-remove-if (function not)
      (mapcar (function (lambda (x)
      (if (eq 10 (car x))(cdr x))))
    elist)))
    (setq p1 (car coors)
    p2 (cadr coors)
    p3 (caddr coors)
    p4 (cadddr coors)
    ang1 (angle p1 p2)
    ang2 (if (ccw-test coors)(+ (/ pi 2) ang1)(- ang1 (/ pi 2) ))
    len1 (distance p1 p2)
    len2 (distance p4 p3)
    wid1 (distance p2 p3)
    wid2 (distance p4 p1)
    ar1 (vlax-curve-getarea rect)
    len (/ (+ len1 len2) 2)
    wid (/ ar1 len)
    p2 (polar p1 ang1 len)
    p3 (polar p2 ang2 wid)
    p4 (polar p1 ang2 wid)
    pt_list (apply 'append (list p1 p2 p3 p4))
)
(vlax-put (vlax-ename->vla-object rect) 'Coordinates pt_list)
)
)
(*error* nil)
(princ)
)
(prompt "\n\t>>>\tНабери в командной строке RCN для старта\t>>>\n)
(princ)

~'J'~