Как загрузить и визуализировать файл .ply [duplicate]

Джошуа Блох говорит об эффективном Java

Вы должны переопределить hashCode () в каждом классе, который переопределяет equals (). Несоблюдение этого требования приведет к нарушению общего договора для Object.hashCode (), что предотвратит правильное функционирование вашего класса в сочетании со всеми коллекциями на основе хешей, включая HashMap, HashSet и Hashtable.

Попробуем понять это с примером того, что произойдет, если мы переопределим equals() без переопределения hashCode() и попытаемся использовать Map.

Скажем, у нас есть класс как и это, и что два объекта из MyClass равны, если их importantField равны (с hashCode() и equals(), сгенерированными затмением)

public class MyClass {

    private final String importantField;
    private final String anotherField;

    public MyClass(final String equalField, final String anotherField) {
        this.importantField = equalField;
        this.anotherField = anotherField;
    }

    public String getEqualField() {
        return importantField;
    }

    public String getAnotherField() {
        return anotherField;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((importantField == null) ? 0 : importantField.hashCode());
        return result;
    }

    @Override
    public boolean equals(final Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final MyClass other = (MyClass) obj;
        if (importantField == null) {
            if (other.importantField != null)
                return false;
        } else if (!importantField.equals(other.importantField))
            return false;
        return true;
    }

}

Только переопределение equals

Если превышено только equals, тогда, когда вы вызываете myMap.put(first,someValue), сначала будет хеш к некоторому ведру, и когда вы вызываете myMap.put(second,someOtherValue), он будет хешировать в каком-то другом ковше (поскольку у них есть другой hashCode ]). Таким образом, хотя они равны, поскольку они не имеют хеша в одном и том же ковше, карта не может ее реализовать, и оба они остаются на карте.


Хотя нет необходимости переопределить equals(), если мы переопределим hashCode(), посмотрим, что произойдет в этом конкретном случае, когда мы знаем, что два объекта из MyClass равны, если их importantField равны, но мы не переопределяем equals().

Только переопределение hashCode

Представьте, что у вас есть

MyClass first = new MyClass("a","first");
MyClass second = new MyClass("a","second");

Если вы только переопределяете hashCode, тогда, когда вы вызываете myMap.put(first,someValue), это занимает сначала, вычисляет его hashCode и сохраняет его в данном ковше. Затем, когда вы вызываете myMap.put(second,someOtherValue), он должен заменить сначала вторым в соответствии с Documentation Document , потому что они равны (в соответствии с бизнес-требованием).

Но проблема в том, что равен не было переопределено, поэтому, когда хэши карты second и повторяются через ведро, глядя, есть ли объект k, такой, что second.equals(k) истинно, он не будет найден, поскольку second.equals(first) будет false.

Надеюсь, что было ясно

2
задан userzizzy 10 June 2015 в 20:35
поделиться

2 ответа

Функция pcl::io::loadPLYFile() действительно то, что вы должны использовать для чтения файлов PLY. Чтобы решить проблему компиляции, убедитесь, что вы включили соответствующий файл заголовка (pcl/io/ply_io.h).

7
ответ дан taketwo 23 August 2018 в 19:32
поделиться

Мы также можем создать PLYReader в качестве PCDReader, как показано ниже, чтобы прочитать файл PLY и все точки в нужное облако

#include<pcl/io/ply_io.h>

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ);
pcl::PLYReader Reader;
Reader.read("Path of the PLY file", *cloud);
0
ответ дан KHV 23 August 2018 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: