Интерполирование линии между двумя другими строками в python [duplicate]

Члены класса:

Для деструктора pure virtual требуется реализация.

Объявление деструктора по-прежнему требует определения его (в отличие от обычной функции):

struct X
{
    virtual ~X() = 0;
};
struct Y : X
{
    ~Y() {}
};
int main()
{
    Y y;
}
//X::~X(){} //uncomment this line for successful definition

Это происходит потому, что деструкторы базового класса вызывается, когда объект уничтожается неявно, поэтому требуется определение.

virtual методы должны быть реализованы или определены как чистые.

Это похоже на методы не virtual без определения, с добавлением аргументов, которые генерирует чистая декларация dummy vtable, и вы можете получить ошибку компоновщика без использования функции:

struct X
{
    virtual void foo();
};
struct Y : X
{
   void foo() {}
};
int main()
{
   Y y; //linker error although there was no call to X::foo
}

Чтобы это сработало, объявите X::foo() чистым:

struct X
{
    virtual void foo() = 0;
};

Non- virtual

Некоторые члены должны быть определены, даже если они явно не используются:

struct A
{ 
    ~A();
};

Следующие ошибки приведут к ошибке:

A a;      //destructor undefined

Реализация может быть встроенной в самом определении класса:

struct A
{ 
    ~A() {}
};

или снаружи:

A::~A() {}

Если реализация вне определения класса, но в заголовке, методы должны быть отмечены как inline, чтобы предотвратить множественное определение.

Все используемые методы-члены должны быть определены, если они используются.

Общей ошибкой является отказ от квалификации имени:

struct A
{
   void foo();
};

void foo() {}

int main()
{
   A a;
   a.foo();
}

Определение должно быть

void A::foo() {}

static. Члены данных должны быть определены вне класса в единственная единица перевода:

struct X
{
    static int x;
};
int main()
{
    int x = X::x;
}
//int X::x; //uncomment this line to define X::x

Инициализатор может быть предоставлен для элемента данных static const типа интеграла или перечисления в определении класса; однако odr-использование этого элемента по-прежнему потребует определения области пространства имен, как описано выше. C ++ 11 позволяет инициализировать внутри класса для всех членов static const данных.

7
задан nucleon 8 December 2013 в 20:45
поделиться

1 ответ

Хороший лорд, я, наконец, понял это. Вот конечный результат:

The final product [/g1]

Красиво! Но какая была большая работа.

Мой код слишком мощеный и слишком специфичен для моего проекта, чтобы он был очень полезен для кого-либо еще. Но вот основная логика.

У вас должно быть два набора данных для интерполяции. Я называю это «внешней» кривой и «внутренней» кривой. Предполагается, что «внешняя» кривая полностью охватывает и не пересекается с «внутренней» кривой. Кривые на самом деле являются просто наборами данных X, Y и соответствуют набору значений, определенных как Z. В приведенном здесь примере «внешняя» кривая соответствует Z = 50, а «внутренняя» кривая соответствует Z = 100 .

Цель, просто повторить, состоит в том, чтобы найти X для любого заданного Y, где Z - некоторое число между нашими известными точками данных.

  1. Начните с вычисления процента между двумя наборами кривых, которые представляет неизвестный Z. Поэтому, если Z = 75 в нашем примере, тогда это будет 0,5. Если Z = 60, то это будет 0,2. Если Z = 90, то это будет 0,8. Назовите эту пропорцию P.
  2. Выберите точку данных на «внешней» кривой, где Y = ваш желаемый Y. Представьте себе сегмент линии между этой точкой и 0,0. Определите это как AB.
  3. Мы хотим найти, где AB пересекается с «внутренней» кривой. Для этого мы перебираем каждую точку на внутренней кривой. Определите отрезок линии между выбранной точкой и точкой + 1 как CD. Проверьте, пересекаются ли AB и CD. Если нет, продолжайте итерацию до тех пор, пока они не сделают это.
  4. Когда мы найдем пересечение AB-CD, мы теперь посмотрим на линию, созданную пересечением, и нашу исходную точку на «внешней» кривой с шага 2. Это сегмент линии, то есть линия между внутренней и внешней кривой, где наклон линии, если бы она продолжалась «вниз» на диаграмме, пересекалась бы с 0,0. Определите этот новый сегмент линии как EF.
  5. Найдите позицию на P percent (с шага 1) длины EF. Проверьте значение Y. Это наше желаемое значение Y? Если это (маловероятно), верните X этой точки. Если нет, посмотрите, меньше ли Y, чем цель Y. Если это так, сохраните позицию этой точки в переменной, которую я дам ниже. Затем снова вернитесь к шагу 2 для следующей точки внешней кривой. Если он равен больше цели Y, посмотрите, имеет ли значение lowY в нем значение. Если это так, интерполируйте между этими двумя значениями и верните интерполированный X. (У нас есть «в штучной упаковке» наша желаемая координата, другими словами.)

Вышеупомянутая процедура работает очень хорошо. Это не удается в случае Y = 0, но это легко сделать, поскольку вы можете просто сделать интерполяцию по этим двум конкретным точкам. В тех местах, где количество выборки намного меньше, оно производит вид неровных результатов, но я предполагаю, что это следует ожидать (это Z = 5000,6000,7000,8000,9000,10000, где только 5000 и 10000 являются известными точками и они имеют только 20 точек данных, остальные - интерполированы):

Jaggy results [/g2]

Я не претендую на то, что это оптимизированное решение, но решение для на моем компьютере практически мгновенно возникают точки, поэтому я полагаю, что он не слишком обременен современной машиной, по крайней мере, с количеством общих очков, которые у меня есть (30-50 на кривую).

Спасибо за помощь каждого; это помогло много поговорить об этом немного и понять, что то, что я действительно собираюсь здесь, не было простой линейной интерполяцией, а своего рода «радиальной» интерполяцией вдоль кривой.

9
ответ дан nucleon 25 August 2018 в 16:33
поделиться
Другие вопросы по тегам:

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