Трета задача - Пресичания

  1. Тъй като искам да си добавя функции към Vector от geom пакета, то ок ли е ако си пиша локално в vector.go файла и така да добавя функциите, които ми трябват? Или използването на alias-и е по-добре ?

  2. На тестовете ще има ли case-ове с изродени фигури - триъгълници, чиито върхове лежат на 1 права, сфери с нулев радиус, четириъгълници които всъщност не лежат в 1 равнина? Трябва ли да се грижим за това в нашия код (независимо дали прави разлика за поведението на Intersect метода)?

  3. Също така, ако един лъч geom.Ray и един триъгълник Triangle лежат в една равнина, разглеждаме ли възможността лъчът да пресича триъгълника или го броим като "не го пресича"?

  4. И аз имам няколко въпроса:

    • четириъгълниците задължително изпъкнали ли са?
    • възможно ли е координатите на ъглите на четириъгълниците да бъдат подадени в такава поредност, че страните да се кръстосват? Т.е. можем ли да приемем без да проверяваме, че AC и BD са диагонали, а AB, BC, CD и DA са страни?
  5. @Георги - относно лъча и триъгълника, които лежат в една равнина - ако един лъч лежи в дадена равнина(успореден на нея), то те се пресичат в безкрайна точка, т.е разглеждат се като успоредни. Практически не се пресичат.

  6. @Красена Ако един лъч и един триъгълник лежат в една и съща равнина (не говоря за лъчът да е успореден на равнината на триъгълника), то те могат да се пресичат в същински точки (не безкрайни). Въпросът е от гледна точка на ray tracing дали това ни интересува?

  7. Уравнението на равнината през трите точки е z = 0. За да намериш точката, в която правата пресича равнината, разглеждаш системата: (-1,-1,0)+t(1,1,0)=(0,0,1) Откъдето получаваш, че t = 0 => правата лежи в равнината. Ако не лежеше, то t щеше да е различно от 0. Щом не пресича равнината, няма как да мине и през триъгълника, който лежи в нея. https://www.geogebra.org/3d <- този сайт става, за да си ги представиш нещата ^.^

  8. @Красена :D Окей, ще реформулирам въпроса си: Ако един лъч лежи в дадена равнина, то той пресича ли я? И докато съм на тази вълна: Според условието лъчът е дефиниран със следното параметрично уравнение

    P(t) = O + t * D, където O е началото на лъча и D е посоката му

    Предполагам е пропуснато, но тук се има предвид и под ограничението t>=0 .

    Ще дам конкретен пример и ще задам въпроса, дали лъчът пресича триъгълника:

        Триъгълник tr: 
                 А(1,0,0) 
                 B(0,1,0) 
                 C(0,0,0)
    
        Лъч ray: 
                Origin(1/4, 1/4, 1)
                Direction(0,0,1).
    

    Какво ще върне tr.Intersect(ray)?

  9. В задачата за проверката дали лъча е успореден на равнината ми трябва проверка дали едно число е 0, но то е float64, а знаем че компюъра не се справя с float-ове.

    Та тази проверка мога да я извърша с някаква точност - епсилон.

    Колко малко епсилон да използвам?

  10. И аз имам един върпос:

    Можем ли да ползваме sqrt от math библиотеката? Трябва ми за намиране на дължина на вектор.

    Или можем ли да ползваме синус и косинус, за намирането на лице?

  11. Ох, тук въпросите рязко са се появили през уикенда :D Сега ще опитам да отговоря на всички:

    @Мартин, не можеш да добавиш функции на външен пакет. Бих ти препоръчал да си направиш локални helper-и. Или алтернативно, приемаме смислени PR-и към geom пакета. За точността - прав си. Епсилон от 1e-7 ми се вижда достатъчен.

    @Георги, всички фигури ще са "нормални". Точките на фигура няма да лежат на една права, няма да има нулеви радиуси. Също така, няма да опитваме да пресичаме лъчи, които са в същата равнина с фигурата. Целта на задачата не е да проверим за колко частни случай ще се сетите, макар да би било забавно. Също така си прав, че t >= 0 в уравнението на лъча се подразбира.

    @Александър, точките на фигурите винаги ще бъдат задавани в ред, така че фигурата да се затвори. Това изречение, всъщност има смисъл само за четириъгълник така и така :D

    @Траян, може да използваш всичко в стандартната библиотека.

  12. @Николай - не. Четириъгълниците са просто фигура затворена от четири точки. Никъде в условието не сме им задавали допълнителни свойства, така че не можеш да ги очакваш. Също така, за добрите решения на задачата изпъкналост или не няма значение.

    @Константин - в този примерен тест няма голямо значение тъй като той проверява само за интерфейса. Но за да си по - спокоен го оправих да изглежда както е беше първоначалното ми намерение за него.

  13. @Doychin Тоест да си представим четириъгълника като два триъгълника не е особено добро решение? :(

    Също, трябва ли да разглеждаме възможността четириъгълниците да са вдлъбнати или допускаме, че всички са изпъкнали?

  14. Сега има добавени функции в пакета geom в Github.

    Вие казахте, че пакета geom ще го има по време на изпълнение на тестовете ни, но ще има първоначалната версия на пакета или тази - последната, която е в master branch-a на fmi/go-homeworks в github ?

  15. @Мартин, ще е последната версия на пакета.

    @Константин, да прав си - не е особено добро решение. Но с достатъчно внимание е възможно да е вярно.

  16. Ам имам един въпрос като искам да предам в формата за предаване на третото домашно и си копирам кода ми казва, че имам синтактична грешка някъде, но като го build-на с go build на Visual Code няма грешки. Форматирах го с gofmt -w и пробвах пак после и с go fmt пак ми казва, че има синтактична грешка. Понеже си свалих папката с geom пакета при мен си я инпортвам нея, пробвах да importna url-a от github пак казва, че има грешка, някаква идея от какво може да е ? Също като промена importa da не е import "geom", geom е папката, която съм клонирал от репото в github а сложа import "github.com/fmi/go-homework/geom" ми дава е тази грешка dom3.go:7:2: cannot find package "github.com/fmi/go-homework/geom" in any of: C:\Go\src\github.com\fmi\go-homework\geom (from $GOROOT) C:\Users\ivodi\go\src\github.com\fmi\go-homework\geom (from $GOPATH) Като написах go get github.com/fmi/go-homework/geom вече не ми дава грешката, но пак не мога кача във формата за предаване. Качих го но с маин функция иначе ми дава грешка това ок ли е ?

  17. Третират ли се като пресичане допиране в една точка или един ръб? Пример: Подадения Ray минава точно през един от върховете на триъгълник - какво се очаква да върне Intersect?

  18. Импортвам пакета в програмата ми така: import "github.com/fmi/go-homework/geom". И нямам пакета качен при мен. Когато искам да ползвам новите функции в geom пакета като АddVectors, Dot, Cross и т.н. не мога и ми дава да ползвам само старите функции, които са дефинирани в пакета.

    Защо не мога да ползвам новите функции? Нали import "github.com/fmi/go-homework/geom" ми импортва пакета, не се ли проверява дали този пакет няма нови добавени функции?

  19. @Мартин Всичко което import-а прави е да отиде и да вземе сорса от директорията, която си му подал, в GOPATH environment-а ти. Тоест версията, която ползваш на този импорт, е в $GOPATH/github.com/gmi/go-homework/geom. Ако не е актуална -> go get github.com/fmi/go-homework/geom -> прясно клонирано репо под GOPATH -> актуална версия.

  20. @Мартин - Използвай това: go get -u github.com/fmi/go-homework/geom

    Забележи -u флага. Това ще накара go get да обнови твоето dependency. Go няма механизъм за автоматично обновяване на dependency-та след като вече си ги свалил с go get на машината си, затова се налага да го правиш ръчно :)

  21. Intersection не трябва да връща true при сечение с правата на лъча, нали? Примерно когато фигурата е "зад" лъча, тоест дистанцията до точката на пресичане с фигурата, в уравнението на лъча, е отрицателна.

Трябва да сте влезли в системата, за да може да отговаряте на теми.