Публикувана е третата задача за домашно. Ще ви е много полезно предварително да прочетете този гайд. Условието, както и малък тест, могат да бъдат намерени и в github хранилището ни.
Тук можете да ни питате ако има нещо неясно по условието.
Публикувана е третата задача за домашно. Ще ви е много полезно предварително да прочетете този гайд. Условието, както и малък тест, могат да бъдат намерени и в github хранилището ни.
Тук можете да ни питате ако има нещо неясно по условието.
Тъй като искам да си добавя функции към Vector от geom пакета, то ок ли е ако си пиша локално в vector.go файла и така да добавя функциите, които ми трябват? Или използването на alias-и е по-добре ?
На тестовете ще има ли case-ове с изродени фигури - триъгълници, чиито върхове лежат на 1 права, сфери с нулев радиус, четириъгълници които всъщност не лежат в 1 равнина? Трябва ли да се грижим за това в нашия код (независимо дали прави разлика за поведението на Intersect метода)?
Също така, ако един лъч geom.Ray и един триъгълник Triangle лежат в една равнина, разглеждаме ли възможността лъчът да пресича триъгълника или го броим като "не го пресича"?
И аз имам няколко въпроса:
@Георги - относно лъча и триъгълника, които лежат в една равнина - ако един лъч лежи в дадена равнина(успореден на нея), то те се пресичат в безкрайна точка, т.е разглеждат се като успоредни. Практически не се пресичат.
@Красена Ако един лъч и един триъгълник лежат в една и съща равнина (не говоря за лъчът да е успореден на равнината на триъгълника), то те могат да се пресичат в същински точки (не безкрайни). Въпросът е от гледна точка на ray tracing дали това ни интересува?
@Георги, може ли да дадеш конкретен пример, в който смяташ, че това се случва?
@Красена Давидова - Триъгълник с върхове A(0,0,0), B(1,0,0), C(0,1,0). Лъч с начало Origin(-1, -1, 0) и посока Direction(1,1,0). Пресечни точки: (0,0,0) и (1/2, 1/2, 0).
Уравнението на равнината през трите точки е z = 0. За да намериш точката, в която правата пресича равнината, разглеждаш системата: (-1,-1,0)+t(1,1,0)=(0,0,1) Откъдето получаваш, че t = 0 => правата лежи в равнината. Ако не лежеше, то t щеше да е различно от 0. Щом не пресича равнината, няма как да мине и през триъгълника, който лежи в нея. https://www.geogebra.org/3d <- този сайт става, за да си ги представиш нещата ^.^
@Красена :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)?
Ако не се лъжа, false. Поне на око и според моя код, което като цяло е нулева гаранция, but still
В задачата за проверката дали лъча е успореден на равнината ми трябва проверка дали едно число е 0, но то е float64, а знаем че компюъра не се справя с float-ове.
Та тази проверка мога да я извърша с някаква точност - епсилон.
Колко малко епсилон да използвам?
И аз имам един върпос:
Можем ли да ползваме sqrt от math библиотеката? Трябва ми за намиране на дължина на вектор.
Или можем ли да ползваме синус и косинус, за намирането на лице?
Ох, тук въпросите рязко са се появили през уикенда :D Сега ще опитам да отговоря на всички:
@Мартин, не можеш да добавиш функции на външен пакет. Бих ти препоръчал да си направиш локални helper-и. Или алтернативно, приемаме смислени PR-и към geom
пакета. За точността - прав си. Епсилон от 1e-7
ми се вижда достатъчен.
@Георги, всички фигури ще са "нормални". Точките на фигура няма да лежат на една права, няма да има нулеви радиуси. Също така, няма да опитваме да пресичаме лъчи, които са в същата равнина с фигурата. Целта на задачата не е да проверим за колко частни случай ще се сетите, макар да би било забавно. Също така си прав, че t >= 0
в уравнението на лъча се подразбира.
@Александър, точките на фигурите винаги ще бъдат задавани в ред, така че фигурата да се затвори. Това изречение, всъщност има смисъл само за четириъгълник така и така :D
@Траян, може да използваш всичко в стандартната библиотека.
Четириъгълниците винаги ли ще са изпъкнали?
@Александър @Doychin Не баш. В малкия тест диагоналите са AD и BC, а пък страните са AB, BD, DC и CA.
@Николай - не. Четириъгълниците са просто фигура затворена от четири точки. Никъде в условието не сме им задавали допълнителни свойства, така че не можеш да ги очакваш. Също така, за добрите решения на задачата изпъкналост или не няма значение.
@Константин - в този примерен тест няма голямо значение тъй като той проверява само за интерфейса. Но за да си по - спокоен го оправих да изглежда както е беше първоначалното ми намерение за него.
@Doychin Тоест да си представим четириъгълника като два триъгълника не е особено добро решение? :(
Също, трябва ли да разглеждаме възможността четириъгълниците да са вдлъбнати или допускаме, че всички са изпъкнали?
@Константин - може да провериш кой от върховете в вдлъбнат и според това да си избереш как да разделиш четириъгълника на триъгълници
Сега има добавени функции в пакета geom в Github.
Вие казахте, че пакета geom ще го има по време на изпълнение на тестовете ни, но ще има първоначалната версия на пакета или тази - последната, която е в master branch-a на fmi/go-homeworks в github ?
@Мартин, ще е последната версия на пакета.
@Константин, да прав си - не е особено добро решение. Но с достатъчно внимание е възможно да е вярно.
Ам имам един въпрос като искам да предам в формата за предаване на третото домашно и си копирам кода ми казва, че имам синтактична грешка някъде, но като го 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 вече не ми дава грешката, но пак не мога кача във формата за предаване. Качих го но с маин функция иначе ми дава грешка това ок ли е ?
Третират ли се като пресичане допиране в една точка или един ръб? Пример: Подадения Ray минава точно през един от върховете на триъгълник - какво се очаква да върне Intersect?
Павка, в условието най-отдолу пише: "Крайните ръбове, дефиниращи фигурите, са част от нея и съответно трябва да връщат true за пресичания." :)
@Траян Уж два пъти прегледах условието за подобно уточнение... Мерси.
Импортвам пакета в програмата ми така: import "github.com/fmi/go-homework/geom". И нямам пакета качен при мен. Когато искам да ползвам новите функции в geom пакета като АddVectors, Dot, Cross и т.н. не мога и ми дава да ползвам само старите функции, които са дефинирани в пакета.
Защо не мога да ползвам новите функции? Нали import "github.com/fmi/go-homework/geom" ми импортва пакета, не се ли проверява дали този пакет няма нови добавени функции?
@Мартин Всичко което import-а прави е да отиде и да вземе сорса от директорията, която си му подал, в GOPATH environment-а ти. Тоест версията, която ползваш на този импорт, е в $GOPATH/github.com/gmi/go-homework/geom. Ако не е актуална -> go get github.com/fmi/go-homework/geom -> прясно клонирано репо под GOPATH -> актуална версия.
@Мартин - Използвай това: go get -u github.com/fmi/go-homework/geom
Забележи -u флага. Това ще накара go get да обнови твоето dependency. Go няма механизъм за автоматично обновяване на dependency-та след като вече си ги свалил с go get на машината си, затова се налага да го правиш ръчно :)
Благодаря за отговорите! :))
Intersection не трябва да връща true при сечение с правата на лъча, нали? Примерно когато фигурата е "зад" лъча, тоест дистанцията до точката на пресичане с фигурата, в уравнението на лъча, е отрицателна.
Трябва да сте влезли в системата, за да може да отговаряте на теми.